基于3水平condition列重排44行df:交替排序需求及报错解决
数据框重排需求与解决方案
问题描述
有一个44行的数据框df,condition列包含3个水平:
- neutral:11行
- fem:11行
- filler:22行
需要完成两步操作:
- 随机打乱每个水平内的行
- 按
filler→neutral→filler→fem的交替顺序重排整个数据框
数据框结构
Rows: 44 Columns: 11 $ display <chr> "experimental_eye_tracking", "experimental_eye_tracking", "experimental_eye_tracking"… $ ANSWER <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N… $ TopLeft <chr> "1_row-1-column-1.png", "2_row-1-column-1.png", "3_row-1-column-1.png", "4_row-1-colu… $ BottomLeft <chr> "1_row-1-column-2.png", "2_row-1-column-2.png", "3_row-1-column-2.png", "4_row-1-colu… $ TopRight <chr> "1_row-2-column-1.png", "2_row-2-column-1.png", "3_row-2-column-1.png", "4_row-2-colu… $ BottomRight <chr> "1_row-2-column-2.png", "2_row-2-column-2.png", "3_row-2-column-2.png", "4_row-2-colu… $ audio <chr> "بعد الصيف تم انتخاب الرئيسة.mp3", "بعد الصباح تم إخراج الأم.mp3", "في المساء تم تنوي… $ item_type <chr> "experimental", "experimental", "experimental", "experimental", "experimental", "expe… $ condition <chr> "neutral", "neutral", "neutral", "neutral", "neutral", "neutral", "neutral", "neutral… $ comprehension_Q <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
condition列分布
[1] "neutral" "neutral" "neutral" "neutral" "neutral" "neutral" "neutral" "neutral" "neutral" "neutral" "neutral" [12] "fem" "fem" "fem" "fem" "fem" "fem" "fem" "fem" "fem" "fem" "fem" [23] "filler" "filler" "filler" "filler" "filler" "filler" "filler" "filler" "filler" "filler" "filler" [34] "filler" "filler" "filler" "filler" "filler" "filler" "filler" "filler" "filler" "filler" "filler"
condition列dput数据
c("neutral", "neutral", "neutral", "neutral", "neutral", "neutral", "neutral", "neutral", "neutral", "neutral", "neutral", "fem", "fem", "fem", "fem", "fem", "fem", "fem", "fem", "fem", "fem", "fem", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler", "filler")
已尝试操作
使用相关方案时出现错误:Arguments have differing numbers of rows
期望结果
最终数据框按以下顺序排列(示例):
Rows: 10 Columns: 2 $ condition <chr> "filler", "neutral", "filler", "fem", "filler", "neutral", "filler", "fem", "filler", "neutral" $ trial <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
可行解决方案
通过dplyr和tibble包实现,步骤如下:
- 加载所需包:
library(dplyr) library(tibble)
- 拆分数据框并打乱各水平内的行:
# 拆分并随机打乱每个组 neutral_shuffled <- df %>% filter(condition == "neutral") %>% sample_frac(1) fem_shuffled <- df %>% filter(condition == "fem") %>% sample_frac(1) filler_shuffled <- df %>% filter(condition == "filler") %>% sample_frac(1) # 将filler拆分为两个等长组(各11行) filler1 <- filler_shuffled[1:11, ] filler2 <- filler_shuffled[12:22, ]
- 按指定顺序拼接数据框:
# 创建交替顺序的索引映射 order_df <- tibble( group = rep(c("filler1", "neutral", "filler2", "fem"), each = 11), idx = rep(1:11, 4) ) # 按索引拼接并整理最终数据框 final_df <- order_df %>% group_by(group) %>% mutate(row = list( if (group == "filler1") filler1[idx, ] else if (group == "neutral") neutral_shuffled[idx, ] else if (group == "filler2") filler2[idx, ] else fem_shuffled[idx, ] )) %>% unnest(row) %>% ungroup() %>% select(-group, -idx)
- 验证结果:
# 查看前10行的condition列顺序 head(final_df$condition, 10)
内容的提问来源于stack exchange,提问作者Alaa
相关产品推荐
相关产品推荐

