我有一个包含以下列的数据集:
ID Measure1 Measure2 XO X1 x2 x3 x4 x5
1 30 2 item1 item1 item23 NA item6 item9
2 23 2 item1 item323 item1 item4 item5 NA
3 2 2 item1 item78 item3 NA item1 item5
我想用 R 中的这段 SAS 代码创建一个标志变量:
data dt2;
set dt1;
array x {5} x1 - x5;
do i=1 to 5;
if x0=x{i} then do;
flag=i;
leave;
end;
end;
drop i;
run;
目标是能够浏览 x1-x5 的值并查看 xo 等于其中任何一个的位置并返回位置,例如,如果在 x1 处找到 item1,则如果在位置 x3 中找到则返回值 1 3.
最终产品看起来像这样:
ID Measure1 Measure2 XO X1 x2 x3 x4 x5 Flag
1 30 2 item1 item1 item23 NA item6 item9 1
2 23 2 item1 item323 item1 item4 item5 NA 2
3 2 2 item1 item78 item3 NA item1 item5 4
请记住,可能存在 x1-x5 的所有行都包含 NA 的情况,在这种情况下我想返回空白,这可能吗?
我无法在 R 中找到动态意义上的等效内容(无需使用 sqldf 编写多个 if 语句或 case when),因为现在列可能是 5,但将来可能会更改为最多 20。
有任何想法吗?
我们可以用max.col
df1$Flag <- max.col(df1$XO[row(df1[-1])]==df1[-1], 'first')
df1
# XO X1 x2 x3 x4 x5 Flag
#1 item1 item1 item23 item5 item6 item9 1
#2 item1 item323 item1 item4 item5 itm87 2
#3 item1 item78 item3 item98 item1 item5 4
Update
基于更新的数据集,我们可以将逻辑矩阵中的 NA 元素替换为FALSE
然后使用max.col
。如果一行中没有 TRUE 值,我们可以将其设置为NA
通过得到rowSums
,检查是否为0,将0改为NA(NA^..
)并乘以max.col(.
.
df3 <- df2[5:ncol(df2)]
i1 <- df2$XO[row(df3)]==df3
i2 <- replace(i1, is.na(i1), FALSE)
df2$Flag <- max.col(i2, 'first') * NA^(rowSums(i2)==0)
df2
# ID Measure1 Measure2 XO X1 x2 x3 x4 x5 Flag
#1 1 30 2 item1 item1 item23 <NA> item6 item9 1
#2 2 23 2 item1 item323 item1 item4 item5 <NA> 2
#3 3 2 2 item1 item78 item3 <NA> item1 item5 4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)