数据帧已包含一个称为 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引用数据作为一个缩影示例。
答案 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))