我有一个数据框,其中有重复的值,我想将其作为唯一标识符列。数据框的其他列包含我想通过创建新的“重复”列来保留的数据。例如,给定以下数据框:
sample_df <- data.frame(
id = c(1, 1, 1, 2, 2, 3, 3, 3, 3),
test = c("A", "B", "C", "A", "B", "A", "B", "C", "D"),
result = c(93, 88, 89, 73, 89, 71, 73, 73, 75)
)
sample_df
# id test result
# 1 1 A 93
# 2 1 B 88
# 3 1 C 89
# 4 2 A 73
# 5 2 B 89
# 6 3 A 71
# 7 3 B 73
# 8 3 C 73
# 9 3 D 75
有没有办法通过添加非 id 列的新迭代来改变这一点?我在想这样的事情:
# id test1 result1 test2 result2 test3 result3 test4 result4
# 1 1 A 93 B 88 C 89 <NA> NA
# 2 2 A 73 B 89 <NA> NA <NA> NA
# 3 3 A 71 B 73 C 73 D 75
id 列中的最大重复数决定了将非 id 列的新迭代数量加入到数据帧中。
我尝试使用
tidyr::pivot_wider()
执行此操作,但使用此函数,我只能根据列的 values 生成输出列(例如,返回 A
、B
、C
和 D
作为输出列,而不是 test1
、) result1
、test2
、result2
等)。我也可能只是缺乏适当的术语来寻找其他答案来源。
您可以在每个
id
中创建一个“观察编号”列,并将其传递给 names_from
中的 pivot_wider()
:
library(dplyr) # >= 1.1.0
library(tidyr)
sample_df %>%
mutate(obs = row_number(), .by = id) %>%
pivot_wider(
values_from = test:result,
names_from = obs,
names_sep = "",
names_vary = "slowest"
)
# A tibble: 3 × 9
id test1 result1 test2 result2 test3 result3 test4 result4
<dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
1 1 A 93 B 88 C 89 <NA> NA
2 2 A 73 B 89 <NA> NA <NA> NA
3 3 A 71 B 73 C 73 D 75
使用基本 R
reshape
。
reshape(sample_df, idvar='id', timevar='test', direction='wide', v.names=c('test', 'result'))
# id test.A result.A test.B result.B test.C result.C test.D result.D
# 1 1 A 93 B 88 C 89 <NA> NA
# 4 2 A 73 B 89 <NA> NA <NA> NA
# 6 3 A 71 B 73 C 73 D 75