我是R和这个论坛的新手,所以对一个相当基本的问题道歉。
我有一堆列(即变量,因为它是一个数据框),其中的colnames都以相同的名称开头,但以不同的数字结尾,例如:variable_0,variable_1,依此类推,最多12个。 / p>
对于这些列中的每一列,每行包含数字,同样从0到12。
我有兴趣找到(对于每一行)colname的尾随数与该特定变量的值匹配的值:
v_0 v_1 v_2 v_3
1 2 2 2
1 2 3 3
在这个例子中,我想要的是一个新的变量x,对于第1行等于2(因为v_i = i仅用于i = 2),3用于第2行。
理想情况下,代码还包括针对每行存在多个匹配的情况的解决方案:创建变量y,如果#匹配超过1则为1,否则为0;将x设置为第一个匹配。
非常感谢帮助!谢谢!
答案 0 :(得分:3)
试试这个:
trail = as.numeric(gsub(".*_([0-9]*)","\\1",names(df)))
df$x = apply(df, 1, function(u) if(all(trail!=u)) NA else trail[match(T,trail==u)])
#> df
# v_0 v_1 v_2 v_3 x
#1 1 2 2 2 2
#2 1 2 3 3 3
这种方式,如果你有 - 如果 - 蹩脚的数据,如:
df = data.frame(v_0=c(1,1,2), v_1=c(1,2,5), v_2=2:4, v_3=2:4)
# v_0 v_1 v_2 v_3
#1 1 1 2 2
#2 1 2 3 3
#3 2 5 4 4
df$x = apply(df, 1, function(u) if(all(trail!=u)) NA else trail[match(T,trail==u)])
# v_0 v_1 v_2 v_3 x
#1 1 1 2 2 1
#2 1 2 3 3 3
#3 2 5 4 4 NA
trail
包含每列的尾随编号(我认为密钥分隔符为_
)。然后对于每一行,我们检查哪个数字等于列中的跟踪号(我们使用apply
循环,第二个参数1
表示我们循环遍历行 - 2
用于列。如果没有匹配项,我们会返回NA
。如果有一个或多个,我们取第一个数字。
答案 1 :(得分:0)
使用@ ColonelBeauvel数据的另一个选项是
trail <- as.numeric(sub('[^0-9]+', '', names(df)))
indx <- df==trail[col(df)]
df$x <- trail[max.col(indx, 'first')* NA^!rowSums(indx)]
df
# v_0 v_1 v_2 v_3 x
#1 1 1 2 2 1
#2 1 2 3 3 3
#3 2 5 4 4 NA