gpt4 book ai didi

arrays - R 中的 SAS 数组等效项

转载 作者:行者123 更新时间:2023-12-05 00:58:15 24 4
gpt4 key购买 nike

我有一个包含以下列的数据集:

    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

请记住,可能存在所有行 rom x1-x5 都包含 NA 的情况,在这种情况下,我想返回空白,这可能吗?

我无法在 R 中找到动态意义上的等价物(不用编写多个 if 语句或使用 sqldf 时的 case),因为现在列可能是 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

更新

基于更新后的数据集,我们可以将逻辑矩阵中的 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

关于arrays - R 中的 SAS 数组等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33145647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com