我有以下数据集:
library(data.table)
set.seed(123)
dt <- data.table(x_1 = c(3,2,2,1,3,2,1,2,3,3),
x_2 = c(2,1,1,3,2,3,3,1,2,3),
x_3 = c(2,3,3,2,1,2,3,3,1,1),
y_1 = sample(2, 10, replace = T),
y_2 = sample(2, 10, replace = T),
y_3 = sample(2, 10, replace = T))
我想在x列上执行if else操作,如果任何一个x列等于1,则会创建一个新的列,并将值设置为相应的y列。例如,在第5行中,x_3 = 1,因此新列应返回对应于y_3的值。
我的想法是返回与条件匹配的x列的名称作为中间列,然后使用值后缀(1,2,3)从相应的y列中提取值。
但是,创建中间列的第一步是创建一个列表,不符合条件的行将返回character(0)。
cols <- c("x_1", "x_2", "x_3")
dt$int <- apply(dt[,..cols], 1, function(x) names(which(x == 1)))
我的期望输出:
x_1 x_2 x_3 y_1 y_2 y_3 new
3 2 2 1 2 2 NA
2 1 3 2 1 2 1
2 1 3 1 2 2 2
1 3 2 2 2 2 2
3 2 1 2 1 2 2
2 3 2 1 2 2 NA
1 3 3 2 1 2 2
2 1 3 2 1 2 1
3 2 1 2 1 1 1
3 3 1 1 2 1 1
有没有关于如何实现这一点的想法?基于数据表的解决方案将更为可取。
x_1
和x_3
都为1,那么预期结果是什么? - Uwe