我有一组看起来像这样的数据框(它们具有相同的列,而不是相同数量的行):
df1 <- data.frame(v = c("banana", "apple", "orange", "grape", "kiwi fruit", "pear"), x = rnorm(6, 0.06, 0.01))
df2 <- data.frame(v = c("table", "chair", "couch", "dresser", "night stand"), x = rnorm(5, 0.06, 0.01))
df3 <- data.frame(v = c("white", "blue", "pink", "bright red", "orange", "dark green", "black"), x = rnorm(7, 0.06, 0.01))
我有一系列操作(计算 df1$v、df2$v、df3$v 中的单词),我想在这些数据帧上执行这些操作。我发现的一个解决方案是将数据帧放在一个列表中,然后使用 lapply 对列表中的所有数据帧应用一个函数:
ls <- list(df1, df2, df3)
func1 <- function(dat){
dat$complex <- sapply(strsplit(as.character(dat$v), " "), length)
}
ls_func1 <- lapply(ls, FUN = func1)
ls_func1
[[1]]
[1] 1 1 1 1 2 1
[[2]]
[1] 1 1 1 1 2
[[3]]
[1] 1 1 1 2 1 2 1
至少这让我得到了 v 中单词的数量,然后我可以再次将其组合成一个数据帧或其他任何东西。
问题是,它似乎不适用于每个功能。例如,这在为单个数据帧完成时工作正常:
for(i in 1:length(df1$v)){
string <- strsplit(as.character(df1$v[i]), "")
counter <- 0
for(j in 1:length(string[[1]])){
if(grepl("a|b|c|d|e", string[[1]][j])){
counter <- counter + 1
}
}
df1$length[i] <- counter
}
df1
v x length
1 banana 0.05233752 4
2 apple 0.08564292 2
3 orange 0.04679124 2
4 grape 0.06655950 2
5 kiwi fruit 0.05684803 0
6 pear 0.07654617 2
但是当把它转换成一个函数时,它不起作用:
func2 <- function(dat){
for(i in 1:length(dat$v)){
string <- strsplit(as.character(dat$v[i]), "")
counter <- 0
for(j in 1:length(string[[1]])){
if(grepl("a|b|c|d|e", string[[1]][j])){
counter <- counter + 1
}
}
dat$length[i] <- counter
}
}
ls_func2 <- lapply(ls, FUN = func2)
ls_func2
[[1]]
NULL
[[2]]
NULL
[[3]]
NULL
我在这里做错了什么?有什么方法可以使用这些函数和 lapply 在我现有的数据框中创建新列?换句话说,要通过首先应用第一个函数,然后应用第二个函数来创建以下内容:
ls
[[1]]
v x complex length
1 banana 0.05233752 1 4
2 apple 0.08564292 1 2
3 orange 0.04679124 1 2
4 grape 0.06655950 1 2
5 kiwi fruit 0.05684803 2 0
6 pear 0.07654617 1 2
[[2]]
v x complex length
1 table 0.65790811 1 2
....
[[3]]
....
等等。?
最佳答案
这是你追求的吗?在每个函数的右大括号之前添加 return(dat)
。
df1 <- data.frame(v = c("banana", "apple", "orange", "grape", "kiwi fruit", "pear"), x = rnorm(6, 0.06, 0.01))
df2 <- data.frame(v = c("table", "chair", "couch", "dresser", "night stand"), x = rnorm(5, 0.06, 0.01))
df3 <- data.frame(v = c("white", "blue", "pink", "bright red", "orange", "dark green", "black"), x = rnorm(7, 0.06, 0.01))
ls <- list(df1, df2, df3)
func1 <- function(dat){
dat$complex <- sapply(strsplit(as.character(dat$v), " "), length)
return(dat)
}
ls_func1 <- lapply(ls, FUN = func1)
ls_func1
func2 <- function(dat){
for(i in 1:length(dat$v)){
string <- strsplit(as.character(dat$v[i]), "")
counter <- 0
for(j in 1:length(string[[1]])){
if(grepl("a|b|c|d|e", string[[1]][j])){
counter <- counter + 1
}
}
dat$length[i] <- counter
}
return(dat)
}
ls_func2 <- lapply(ls_func1, FUN = func2)
ls_func2
关于r - 从 R 中的函数在数据框中创建新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18154773/