我有一个实验数据集,参与者被分配了四种治疗方法之一。数据在数据集中的组织方式,每种处理都有一组单独的变量,因此对于每一行,一组列(针对他们所看到的处理)具有有效值,其余三组列(对于三组)他们没有看到的治疗方法都是空的。
我想重新排列数据集,以便:
一个新列指定每个参与者被分配了哪种处理方式(即,哪一组列具有该行的有效值)
一组新的列报告参与者被分配到的治疗的列的有效值
当前,我的数据集看起来像是这段代码生成的数据集:
T1a <- c(1, NA, NA, NA)
T1b <- c(2, NA, NA, NA)
T2a <- c(NA, NA, 3, NA)
T2b <- c(NA, NA, 4, NA)
T3a <- c(NA, 0, NA, NA)
T3b <- c(NA, 5, NA, NA)
T4a <- c(NA, NA, NA, 4)
T4b <- c(NA, NA, NA, 2)
data <- rbind(data.frame(T1a, T1b, T2a, T2b, T3a, T3b, T4a, T4b))
> data
T1a T1b T2a T2b T3a T3b T4a T4b
1 1 2 NA NA NA NA NA NA
2 NA NA NA NA 0 5 NA NA
3 NA NA 3 4 NA NA NA NA
4 NA NA NA NA NA NA 4 2
我想按如下方式重新排列数据集:
> data2
Tr a b
1 1 1 2
2 3 0 5
3 2 3 4
4 4 4 2
我知道我可以通过创建新列并为它们分配列的相应值而不会在每一行中丢失数据来手动执行此操作,但是我想知道是否有一种更快,更优雅的方法来实现这一点。
在此先感谢您的帮助!
答案 0 :(得分:3)
使用dplyr
和tidyr
的解决方案。
library(dplyr)
library(tidyr)
data2 <- data %>%
gather(Column, Value) %>%
drop_na(Value) %>%
extract(Column, into = c("Letter", "Tr", "Subject"), regex = "(^T)([0-9]+)([a-z])+$") %>%
spread(Subject, Value) %>%
select(-Letter) %>%
mutate(Tr = as.integer(Tr))
data2
# Tr a b
# 1 1 1 2
# 2 2 3 4
# 3 3 0 5
# 4 4 4 2
答案 1 :(得分:0)
有点过时了,但仍然有用; float
-您可以先int
,然后再reshape2
。我发现它们比其melt
兄弟姐妹更容易使用:
dcast