r - R 中的 Dcast 或 Reshape 数据框

标签 r

我有一个像这样的数据框:

originalDF <- data.frame(A1=c(1, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6), 
                         A2=c(12.2, 12.2, 15.0, 34.123, 2.0, 66.0, 7.0, 7.0, 7.0, 7.0, 7.0), 
                         A3=c('T1', 'T2', 'T1', 'T1', 'T2', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1'), 
                         A4=c('1234', '1234', '1234', '1234', '4321', '4321', '4321', '4321', '4321', '4321', '4321'),
                         A5=c('0245', '0245', '0500', '0500', '0600', '0600', '0600','0800','0700','0900', '0900'))

   A1     A2 A3   A4   A5
1   1 12.200 T1 1234 0245
2   1 12.200 T2 1234 0245
3   2 15.000 T1 1234 0500
4   3 34.123 T1 1234 0500
5   4  2.000 T2 4321 0600
6   5 66.000 T1 4321 0600
7   6  7.000 T1 4321 0600
8   6  7.000 T1 4321 0800
9   6  7.000 T1 4321 0700
10  6  7.000 T1 4321 0900
11  6  7.000 T1 4321 0900

我现在想 reshape 它,它最终看起来像这样:

wantedDF <- cbind.data.frame(originalDF, 
                              A3_0245=c('T1', 'T2', NA, NA, NA, NA, NA, NA, NA, NA, NA), 
                              A3_0500=c(NA, NA, 'T1', 'T1', NA, NA, NA, NA, NA, NA, NA), 
                              A3_0600=c(NA, NA, NA, NA, 'T2', 'T1', 'T1', NA, NA, NA, NA), 
                              A3_0800=c(NA, NA, NA, NA, NA, NA, NA, 'T1', NA, NA, NA), 
                              A3_0700=c(NA, NA, NA, NA, NA, NA, NA, NA, 'T1', NA, NA), 
                              A3_0900=c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 'T1', 'T1'))

   A1     A2 A3   A4   A5 A3_0245 A3_0500 A3_0600 A3_0800 A3_0700 A3_0900
1   1 12.200 T1 1234 0245      T1    <NA>    <NA>    <NA>    <NA>    <NA>
2   1 12.200 T2 1234 0245      T2    <NA>    <NA>    <NA>    <NA>    <NA>
3   2 15.000 T1 1234 0500    <NA>      T1    <NA>    <NA>    <NA>    <NA>
4   3 34.123 T1 1234 0500    <NA>      T1    <NA>    <NA>    <NA>    <NA>
5   4  2.000 T2 4321 0600    <NA>    <NA>      T2    <NA>    <NA>    <NA>
6   5 66.000 T1 4321 0600    <NA>    <NA>      T1    <NA>    <NA>    <NA>
7   6  7.000 T1 4321 0600    <NA>    <NA>      T1    <NA>    <NA>    <NA>
8   6  7.000 T1 4321 0800    <NA>    <NA>    <NA>      T1    <NA>    <NA>
9   6  7.000 T1 4321 0700    <NA>    <NA>    <NA>    <NA>      T1    <NA>
10  6  7.000 T1 4321 0900    <NA>    <NA>    <NA>    <NA>    <NA>      T1
11  6  7.000 T1 4321 0900    <NA>    <NA>    <NA>    <NA>    <NA>      T1

我怎样才能实现这个目标?我已经问过一个类似的问题here但我无法开始工作:(。 这是我已经尝试过的:

DfNames <- unique(originalDF$A5)
wantedDF[,sprintf('A3_%s',DfNames )] <- NA

(现在我需要有条件添加到每列)

(首选 Base R 和 data.table 解决方案!)提前致谢!

最佳答案

data.table 解决方案:

library(data.table)

dt <- as.data.table(originalDF)
dt[, toc := paste('A3', A5, sep = '_')]

res <- dcast(dt, A1 + A2 + A3 + A4 + A5 + rowid(A1) ~ toc, value.var = 'A3')[, A1_1 := NULL]
# > res[]
#     A1     A2 A3   A4   A5 A3_0245 A3_0500 A3_0600 A3_0700 A3_0800 A3_0900
#  1:  1 12.200 T1 1234 0245      T1      NA      NA      NA      NA      NA
#  2:  1 12.200 T2 1234 0245      T2      NA      NA      NA      NA      NA
#  3:  2 15.000 T1 1234 0500      NA      T1      NA      NA      NA      NA
#  4:  3 34.123 T1 1234 0500      NA      T1      NA      NA      NA      NA
#  5:  4  2.000 T2 4321 0600      NA      NA      T2      NA      NA      NA
#  6:  5 66.000 T1 4321 0600      NA      NA      T1      NA      NA      NA
#  7:  6  7.000 T1 4321 0600      NA      NA      T1      NA      NA      NA
#  8:  6  7.000 T1 4321 0700      NA      NA      NA      T1      NA      NA
#  9:  6  7.000 T1 4321 0800      NA      NA      NA      NA      T1      NA
# 10:  6  7.000 T1 4321 0900      NA      NA      NA      NA      NA      T1
# 11:  6  7.000 T1 4321 0900      NA      NA      NA      NA      NA      T1

关于r - R 中的 Dcast 或 Reshape 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45014310/

相关文章:

r - 润滑时区处理

r - 如何用 NA 替换整行 data.table?

python - 仅保留后续行满足条件后的行

r - r中连接字符串的数据透视表

r - 仅根据列中的 "YES"或 "NO"绘制选定的行

R:行和列标签上数据帧子集的平均值

r - 当行的其余部分重复时,如何通过对一列的值求和来合并表

r - 移动水平图中颜色条/颜色键的位置

r - data.table根据条件更新组中的最后一个元素

R如何删除字符串中的非常特殊的字符?