R-run函数从表列表中每个表的现有列中计算一个新列

  • 本文关键字:计算 新列 一个 函数 列表 R-run r
  • 更新时间 :
  • 英文 :


有了一个表列表,就可以在每个表中的现有列上运行一个函数,从而为每个表生成一个新列。

设置:

# dummy data
df1 <- data.frame(X1 = c(1,2,3),  X2 = c(1,1,1))
df2 <- data.frame(X1 = c(5,6,7),  X2 = c(0,0,0))
df3 <- data.frame(X1 = c(8,9,10), X2 = c(1,0,1))
# dummy list
list_01<-list(df1, df2, df3)

那么,是否可以通过在X2的每个实例上运行函数来创建列X3。

预期输出:

list_02[[3]]
X1  X2  X3
1  8   1   Yes
2  9   0   No
3  10  1   Yes

我试图将函数嵌套在cbind中,但没有成功。

# lapply a function
list_02<-lapply(list_01, function(x) 
cbind(x, X3 = ( 
if( x$X2 > 0 ) {
"Yes"
} else if (x$X2 == 0) {
"No"
} else {
"error - check column X2 for numeric"
})))

这会为我生成以下警告:

警告消息:In if(x$X2>0({:条件的长度>1,并且只有第一个元素将被使用

我不明白,但我认为这可能意味着我没有正确使用lapply来处理数据的维度,我需要在lapply中嵌套应用程序吗?谢谢你的帮助或想法。

library(data.table)
lapply(list_01, function(x) setDT(x)[, X3 := ifelse(X2 == 1, "yes", "no")])
# [[1]]
#    X1 X2  X3
# 1:  1  1 yes
# 2:  2  1 yes
# 3:  3  1 yes
# 
# [[2]]
#    X1 X2 X3
# 1:  5  0 no
# 2:  6  0 no
# 3:  7  0 no
# 
# [[3]]
#    X1 X2  X3
# 1:  8  1 yes
# 2:  9  0  no
# 3: 10  1 yes

您可以使用map()函数:

library(tidyverse)
list_01 %>%
map( ~ .x %>%
mutate(X3 = if_else(X2 > 0, "yes", "no")))
#> [[1]]
#>   X1 X2  X3
#> 1  1  1 yes
#> 2  2  1 yes
#> 3  3  1 yes
#> [[2]]
#>   X1 X2 X3
#> 1  5  0 no
#> 2  6  0 no
#> 3  7  0 no
#> [[3]]
#>   X1 X2  X3
#> 1  8  1 yes
#> 2  9  0  no
#> 3 10  1 yes

if不适用于向量。当您将ififelse交换时,它可能会给出预期的结果。

list_02 <- lapply(list_01, function(x)
cbind(x, X3 =
ifelse(x$X2 > 0, "Yes",
ifelse(x$X2 == 0, "No", "error - check column X2 for numeric")
)
)
)
list_02
#[[1]]
#  X1 X2  X3
#1  1  1 Yes
#2  2  1 Yes
#3  3  1 Yes
#
#[[2]]
#  X1 X2 X3
#1  5  0 No
#2  6  0 No
#3  7  0 No
#
#[[3]]
#  X1 X2  X3
#1  8  1 Yes
#2  9  0  No
#3 10  1 Yes

BaseR方式

  • as.logical((对于大于0的数字返回True,对于0返回false
  • 在以上结果中添加一个以上结果将使False变为1,True变为2
  • 使用这些值作为另一个向量c('No', 'Yes')的索引,您将在不使用if/ifele的情况下获得所需的结果
# dummy data
df1 <- data.frame(X1 = c(1,2,3),  X2 = c(1,1,1))
df2 <- data.frame(X1 = c(5,6,7),  X2 = c(0,0,0))
df3 <- data.frame(X1 = c(8,9,10), X2 = c(1,0,1))
# dummy list
list_01<-list(df1, df2, df3)
lapply(list_01, (df) transform(df, X3 = c('No', 'Yes')[1 + as.logical(X2)]))
#> [[1]]
#>   X1 X2  X3
#> 1  1  1 Yes
#> 2  2  1 Yes
#> 3  3  1 Yes
#> 
#> [[2]]
#>   X1 X2 X3
#> 1  5  0 No
#> 2  6  0 No
#> 3  7  0 No
#> 
#> [[3]]
#>   X1 X2  X3
#> 1  8  1 Yes
#> 2  9  0  No
#> 3 10  1 Yes

创建于2021-06-17由reprex包(v2.0.0(

最新更新