gpt4 book ai didi

r - 从 R 中的函数在数据框中创建新列

转载 作者:行者123 更新时间:2023-12-02 01:59:13 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com