R - 根据与现有列匹配的值索引创建新列数据框

时间:2016-12-30 18:34:03

标签: r dataframe matching

我有一个名为imp2的数据框(大约有6,000行),其中有9列标有'savres1'...'savres9'。每个列中的值都是1或0.对于每一行,这些列中只有1列的值为1(其余为0)。

我想创建一个名为'savres'的新列,我将在其中放置一个介于1和9之间的值,该列与列的索引(在这组9列中)保持1值。例如。如果'savres7'为1且其余列为0,则savres应为7。

我已使用whichmatch%in%的多种变体来查找值,但我没有得到我期望的输出。

下面是最近的试用函数和在数据框中创建的一组示例行。

最近尝试的解决方案:

imp2 <- within(imp2, savres <- which(c(savres1, savres2, savres3, savres4, savres5, savres6, savres7, savres8, savres9) == 1) %% 9 + 1)

结果:

(注意,我没有包括所有列,但是从这里的4,你可以看到该函数不起作用 - 第4行中的'savres'值应为3,第1行和第1行中的值{ 2不应该是4或2)

sample <- head(imp2[c('savres1','savres2','savres3','savres4')],4)

savres | savres1 | savres2 | savres3 | savres4
4      |     0   |    0    |    0    |    0
2      |   0     |    0    |    0    |    0
1      |   1     |    0    |    0    |   0
1      |   0     |   0     |  1      |   0

有人可以推荐一个解决方案吗?

我认为这应该是一个相当简单的操作,但我对我尝试过的一些方法感到沮丧。

1 个答案:

答案 0 :(得分:1)

我们可以使用max.col

i1 <- grep("^savre", names(df1))
transform(df1, savre = (max.col(df1[i1], "first"))* !!rowSums(df1[i1]))
#    col1 col2 savres1 savres2 savres3 savres4 savre
#1    1    2       0       0       0       0     0
#2    2    3       0       0       0       0     0
#3    3    4       1       0       0       0     1
#4    4    5       0       0       1       0     3

数据

df1 <- data.frame(col1 = 1:4, col2 = 2:5, savres1 = c(0, 0, 1,0), 
   savres2 = 0, savres3 = c(0, 0, 0, 1), savres4 = 0)