有了一个表列表,就可以在每个表中的现有列上运行一个函数,从而为每个表生成一个新列。
设置:
# 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
不适用于向量。当您将if
与ifelse
交换时,它可能会给出预期的结果。
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(