R:从列的子集中为每一行查找特定值

时间:2015-03-20 14:03:20

标签: r

我是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设置为第一个匹配。

非常感谢帮助!谢谢!

2 个答案:

答案 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