我正在尝试编写一个R脚本,该脚本将基于位于多个不同列中的值和一个ID字段创建新列,然后使用基于value字段的重复值填充这些列。起始数据框如下所示:
df
ID row1 row2
1 1 x <NA>
2 1 <NA> <NA>
3 1 <NA> y
4 2 <NA> x
5 2 y <NA>
6 3 <NA> x
7 3 <NA> <NA>
8 3 <NA> <NA>
9 3 x <NA>
10 4 <NA> x
这是我希望创建的:
df
ID row1 row2 x1 y1 x2 y2 x3 y3 x4
1 1 x <NA> x <NA> <NA> <NA> <NA> NA <NA>
2 1 <NA> <NA> x <NA> <NA> <NA> <NA> NA <NA>
3 1 <NA> y x y <NA> <NA> <NA> NA <NA>
4 2 <NA> x <NA> <NA> x <NA> <NA> NA <NA>
5 2 y <NA> <NA> <NA> x y <NA> NA <NA>
6 3 <NA> x <NA> <NA> <NA> <NA> x NA <NA>
7 3 <NA> <NA> <NA> <NA> <NA> <NA> x NA <NA>
8 3 <NA> <NA> <NA> <NA> <NA> <NA> x NA <NA>
9 3 x <NA> <NA> <NA> <NA> <NA> x NA <NA>
10 4 <NA> x <NA> <NA> <NA> <NA> <NA> NA x
>
我已经能够基于存在的每个value-ID组合自动创建空列。没有将占用它们的任何值的值对组合不需要创建列,在本示例中为列假设y4。我试图在for循环中使用嵌套的if语句来自动执行该操作,但是我无法在必要时重复这些值。关于如何在ID字段与列匹配时如何从上方获取数据框副本值的任何想法?
答案 0 :(得分:0)
这是一种将产生预期输出的方法,其区别在于它仅显示数据集中实际存在的那些值-ID组合(例如,离开y3列,它们全部为NA
)< / p>
df1 = data.frame(ID = df$ID, val = coalesce(df$row1,df$row2))
df1 %>% unite(comb, ID, val) %>%
mutate(val = df1$val, rn = row_number()) %>%
spread(comb,val) %>% mutate(ID = df$ID, row1 = df$row1, row2 = df$row2) %>%
group_by(ID) %>% fill(everything()) %>%
select(-rn) %>% select(-contains("NA"))
A grouped_df: 10 × 9
1_x 1_y 2_x 2_y 3_x 4_x ID row1 row2
x NA NA NA NA NA 1 x NA
x NA NA NA NA NA 1 x NA
x y NA NA NA NA 1 x y
NA NA x NA NA NA 2 NA x
NA NA x y NA NA 2 y x
NA NA NA NA x NA 3 NA x
NA NA NA NA x NA 3 NA x
NA NA NA NA x NA 3 NA x
NA NA NA NA x NA 3 x x
NA NA NA NA NA x 4 NA x