[英]How can I use R to transpose rows into columns mirroring SAS implementation?
我已经花了很多时间寻找这个问题,却找不到一种似乎并没有使我误解的方法。 我正在尝试在R中复制以下SAS实现 。
现在,我正在尝试找出如何在不聚合的情况下基于多个标识字段对多个值进行转置。
起点示例:
Cat1 Cat2 Cat3 Date Occ Dur
A00 Group1 Sub1 2015-05-09 1 30
A00 Group1 Sub1 2015-09-09 2 30
A00 Group1 Sub2 2015-06-23 1 60
B00 Group1 Sub1 2015-07-30 3 30
B00 Group1 Sub2 2015-03-25 1 60
B00 Group1 Sub2 2015-02-14 2 60
我正在寻找以下输出:
Cat1 Cat2 Cat3 Date1 Date2 Occ1 Occ2 Dur1 Dur2
A00 Group1 Sub1 2015-05-09 2015-09-09 1 2 30 30
A00 Group1 Sub2 2015-06-23 1 60
B00 Group1 Sub1 2015-07-30 3 30
B00 Group1 Sub2 2015-03-25 2015-02-14 1 2 60 60
我意识到不同的环境可能需要不同的方法。 除了直接尝试在SAS中复制逻辑之外,我当然对替代解决方案持开放态度。 我已经尝试过各种尝试,以便在没有任何运气的情况下通过熔炼和铸造来重塑数据。 任何帮助将不胜感激!
这是一个基于data.table
的解决方案,它非常接近地模仿了逻辑:
library(data.table)
library(reshape2)
DT <- fread("Cat1 Cat2 Cat3 Date Occ Dur
A00 Group1 Sub1 2015-05-09 1 30
A00 Group1 Sub1 2015-09-09 2 30
A00 Group1 Sub2 2015-06-23 1 60
B00 Group1 Sub1 2015-07-30 3 30
B00 Group1 Sub2 2015-03-25 1 60
B00 Group1 Sub2 2015-02-14 2 60")
DTw <- dcast(
melt(DT, id.vars = c("Cat1", "Cat2", "Cat3"))[
, Idx := 1:.N
, keyby = .(Cat1,Cat2, Cat3, variable)
]
, Cat1 + Cat2 + Cat3 ~ variable + Idx)
DTw
结果看起来像这样:
Cat1 Cat2 Cat3 Date_1 Date_2 Occ_1 Occ_2 Dur_1 Dur_2
1 A00 Group1 Sub1 2015-05-09 2015-09-09 1 2 30 30
2 A00 Group1 Sub2 2015-06-23 <NA> 1 <NA> 60 <NA>
3 B00 Group1 Sub1 2015-07-30 <NA> 3 <NA> 30 <NA>
4 B00 Group1 Sub2 2015-03-25 2015-02-14 1 2 60 60
这是dpyr
和tidyr
解决方案。 可能有一种方法可以更干净地执行此操作,但是它可以工作。 它确实会发出有关id() is deprecated
的警告,并且我不确定如何摆脱它
library(dplyr)
library(tidyr)
df %>%
gather(key, value, -c(Cat1:Cat3)) %>% ## Put in long format
group_by(Cat1, Cat2, Cat3, key) %>% ## Group for numbering (1,2)
mutate(rn = row_number()) %>% ## Add row numbers to unite with key column
unite(new_key, key, rn, sep = '') %>% ## Make new unique key to be col name
spread(new_key, value, fill = '') %>% ## Put in 'wide' format
select(Cat1, Cat2, Cat3, Date1, Date2, Occ1, Occ2, Dur1, Dur2) # re-order columns
结果
Cat1 Cat2 Cat3 Date1 Date2 Occ1 Occ2 Dur1 Dur2
1 A00 Group1 Sub1 2015-05-09 2015-09-09 1 2 30 30
2 A00 Group1 Sub2 2015-06-23 1 60
3 B00 Group1 Sub1 2015-07-30 3 30
4 B00 Group1 Sub2 2015-03-25 2015-02-14 1 2 60 60
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.