我有一个名为imp2
的数据框(大约有6,000行),其中有9列标有'savres1'...'savres9'
。每个列中的值都是1或0.对于每一行,这些列中只有1列的值为1(其余为0)。
我想创建一个名为'savres'
的新列,我将在其中放置一个介于1和9之间的值,该列与列的索引(在这组9列中)保持1值。例如。如果'savres7'
为1且其余列为0,则savres
应为7。
我已使用which
,match
和%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
有人可以推荐一个解决方案吗?
我认为这应该是一个相当简单的操作,但我对我尝试过的一些方法感到沮丧。
答案 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)