r - 从宽到长的数据框,具有多个变量和 ids R
问题描述
我有一个数据框,其中包含参与者对两篇文本的判断。假设每个文本都有一个正确答案和一个标识符,并且每个文本都被多次判断。
set.seed(123)
wide_df = data.frame('participant_id' = LETTERS[1:12]
, 'judgment_1' = round(rnorm(12)*100)
, 'correct_1' = round(rnorm(12)*100)
, 'text_id_1' = sample(1:12, 12, replace = F)
, 'judgment_2' = round(rnorm(12)*100)
, 'correct_2' = round(rnorm(12)*100)
, 'text_id_2' = sample(13:24, 12, replace = F)
)
以便:
participant_id judgment_1 correct_1 text_id_1 judgment_2 correct_2 text_id_2
1 A -56 40 4 43 -127 17
2 B -23 11 10 -30 217 14
3 C 156 -56 1 90 121 22
4 D 7 179 12 88 -112 15
5 E 13 50 7 82 -40 13
...
我想将其转换为带有列的长格式:
participant_id text_id judgment correct
A 4 -56 40
A 17 43 127
...
我在这里找到并遵循了 SO 建议:
wide_df %>%
gather(v, value, judgment_1:text_id_2) %>%
separate(v, c("var", "col")) %>%
arrange(participant_id) %>%
spread(col, value)
但是这种重塑方式会返回错误Error: Duplicate identifiers for rows (3, 6), (9, 12)
我想我在概念上做了一些错误的事情,但找不到它。我的错误在哪里?谢谢!
解决方案
与我的其他答案相比,这是一种更动态的方式。这不需要手动合并所需的列,但确实依赖于列名模式。
wide_df %>%
gather(variable, value, -participant_id) %>%
mutate(
variable = substr(variable, 1, nchar(variable)-2),
rn = ave(1:length(participant_id), participant_id, variable, FUN = seq_along)
) %>%
spread(variable, value) %>%
select(-rn)
participant_id correct judgment text_id
1 A 40 -56 4
2 A -127 43 17
3 B 11 -23 10
4 B 217 -30 14
5 C -56 156 1
6 C 121 90 22
7 D 179 7 12
8 D -112 88 15
9 E 50 13 7
10 E -40 82 13
11 F -197 172 11
12 F -47 69 19
13 G 70 46 9
14 G 78 55 24
15 H -47 -127 2
16 H -8 -6 20
17 I -107 -69 8
18 I 25 -31 21
19 J -22 -45 3
20 J -3 -38 16
21 K -103 122 5
22 K -4 -69 23
23 L -73 36 6
24 L 137 -21 18
推荐阅读
- java - 显示对象数组列表,在 TableView 的对象数组列表内
- gradle - Gradle jlink 选项给出访问权限警告
- sql - 使用循环 postgres 更新表数据
- list - 我需要存储为地理位置列表的道路数据
- r - ggplot2 中 PCA 分数的 Facetgrid
- python-3.x - 在 Tensorboard 中使用 Tensorflow v2.0 显示图形
- javascript - 页面未使用本地存储更新
- wordpress - add_filter() 中的函数永远不会运行
- python - 将值添加到序列化字典而不加载它
- javascript - 选择 id 并显示名称