R语言技术问询:如何基于列索引值创建新变量
在R语言中创建基于列索引的新变量f
没问题,我来帮你搞定这个需求!你想要根据列c的数值(1或2),提取对应列(d或e)的数值作为新变量f,下面给你两种简单可行的方法:
首先先修正一下你现有代码里的小问题:rep(1:2)生成的是长度为2的向量,和d、e的长度10不匹配,所以要改成rep(1:2, 5)才能正确合并成矩阵,完整的初始化代码如下:
c <- rep(1:2, 5) # 生成10个元素的循环向量:1,2,1,2,... d <- 1:10 # rep(1:10)可以简化成1:10 e <- c(1,5,7,2,3,9,1,6,9,1) z <- cbind(d,e,c)
方法一:利用矩阵索引(高效简洁)
R的矩阵支持用行列索引矩阵来提取值,我们可以生成每行的行号+c列指定的列号,直接提取对应位置的数值:
# 添加f列到z矩阵 z <- cbind(z, f = z[cbind(1:nrow(z), z[,3])])
原理:cbind(1:nrow(z), z[,3])生成了一个10行2列的矩阵,每行是(当前行号, c列指定的列号),用这个矩阵去索引z,就能精准拿到我们需要的f值。
方法二:用ifelse函数(直观易懂)
如果觉得矩阵索引有点绕,用ifelse条件判断更直观,适合新手理解:
z <- cbind(z, f = ifelse(z[,3] == 1, z[,1], z[,2]))
逻辑很简单:当c列的值是1时,取d列(第一列)的对应值;当c列的值是2时,取e列(第二列)的对应值。
执行完上面任意一种方法后,你打印z就能得到预期的结果:
print(z)
输出结果:
d e c f [1,] 1 1 1 1 [2,] 2 5 2 5 [3,] 3 7 1 3 [4,] 4 2 2 2 [5,] 5 3 1 5 [6,] 6 9 2 9 [7,] 7 1 1 7 [8,] 8 6 2 6 [9,] 9 9 1 9 [10,]10 1 2 1
内容的提问来源于stack exchange,提问作者user647764
相关产品推荐
相关产品推荐

