我有一组看起来像这样的数据框(它们具有相同的列,而不是相同数量的行):

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/

10-15 01:54
查看更多