通过另一个向量中包含的字符串动态引用向量名称

时间:2019-09-11 20:01:05

标签: r loops data-manipulation data-cleaning

数据帧包含一个称为 partner 的标识符向量,其值与该数据帧中的其他向量名称相同。

Data_2 = FILTER Data  BY (DAT_015_X > 20190101);

另一个向量 met 表示每次观察由 id 表示的受访者是否与他们分配的 partner 相遇。我需要将 met 的值存储在正确的列 id1 - id10 中,该列名称等同于合作伙伴。例如,第一个观察值应在 id10 列中包含值1。

要:

id  partner met id1 id2 id3 id4 id5 id6 id7 id8 id9 id10
id1  id10   1   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
id2  id6    0   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
id3  id7    0   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
id4  id9    1   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
id5  id8    1   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
id6  NA     NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
id7  NA     NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
id8  NA     NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
id9  NA     NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
id10 NA     NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

如何使用文本变量的值向名称与另一个变量的值匹配的变量系统地分配值?真实的集合包括 id1 - id100 here's a link引用数据作为一个缩影示例。

1 个答案:

答案 0 :(得分:1)

这里是矢量索引的选项。使用具有列名的match和带有行序列的'partner'列cbind获取列索引,以创建matrix,根据索引提取数据集的元素并分配移至“ met”列

nm1 <- grep("^id\\d+$", names(df1))
i1 <- !is.na(df1$partner)
df1[nm1][cbind(seq_len(nrow(df1))[i1],
      match(df1$partner[i1], names(df1)[nm1]))] <- df1$met[i1]
df1
#     id partner met id1 id2 id3 id4 id5 id6 id7 id8 id9 id10
#1   id1    id10   1  NA  NA  NA  NA  NA  NA  NA  NA  NA    1
#2   id2     id6   0  NA  NA  NA  NA  NA   0  NA  NA  NA   NA
#3   id3     id7   0  NA  NA  NA  NA  NA  NA   0  NA  NA   NA
#4   id4     id9   1  NA  NA  NA  NA  NA  NA  NA  NA   1   NA
#5   id5     id8   1  NA  NA  NA  NA  NA  NA  NA   1  NA   NA
#6   id6    <NA>  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   NA
#7   id7    <NA>  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   NA
#8   id8    <NA>  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   NA
#9   id9    <NA>  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   NA
#10 id10    <NA>  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   NA

数据

df1 <- structure(list(id = c("id1", "id2", "id3", "id4", "id5", "id6", 
"id7", "id8", "id9", "id10"), partner = c("id10", "id6", "id7", 
"id9", "id8", NA, NA, NA, NA, NA), met = c(1L, 0L, 0L, 1L, 1L, 
NA, NA, NA, NA, NA), id1 = c(NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA), id2 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), id3 = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA), id4 = c(NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA), id5 = c(NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA), id6 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), 
    id7 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), id8 = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA), id9 = c(NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA), id10 = c(NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-10L))