我在R中有以下数据框
DF2<-data.frame("ID"=c("A", "A", "A", "B", "B", "B", "B", 'B'),
'Freq'=c(1,2,3,1,2,3,4,5), "Val"=c(1,2,4, 2,3,4,5,8))
datframe具有以下外观
ID Freq Val
1 A 1 1
2 A 2 2
3 A 3 4
4 B 1 2
5 B 2 3
6 B 3 4
7 B 4 5
8 B 5 8
我想熔化并重新铸造数据框以产生以下数据框
A_Freq A_Value B_Freq B_Value
1 1 1 1 2
2 2 2 2 3
3 3 4 3 4
4 NA NA 4 5
5 NA NA 5 8
我尝试了以下代码
DF3<-melt(DF2, by=ID)
DF3$ID<-paste0(DF3$ID, DF3$variable)
DF3$variable<-NULL
DF4<-dcast(DF3, value~ID)
这将产生以下数据框
value AFreq AVal BFreq BVal
1 1 1 1 1 NA
2 2 2 2 2 2
3 3 3 NA 3 3
4 4 NA 4 4 4
5 5 NA NA 5 5
6 8 NA NA NA 8
如何获得上述结果。我尝试了dcast的其他变体,但无法获得所需的结果。请求某人帮助
答案 0 :(得分:1)
一个选项是
library(tidyverse)
DF2 %>%
gather(key, val, -ID) %>%
unite(IDkey, ID, key) %>%
group_by(IDkey) %>%
mutate(rn = row_number()) %>%
spread(IDkey, val) %>%
select(-rn)
# A tibble: 5 x 4
# A_Freq A_Val B_Freq B_Val
# <dbl> <dbl> <dbl> <dbl>
#1 1 1 1 2
#2 2 2 2 3
#3 3 4 3 4
#4 NA NA 4 5
#5 NA NA 5 8
或使用melt/dcast
。我们melt
通过将id.var
指定为“ ID”(作为字符串)从“宽”格式转换为“长”格式。然后使用dcast
,用表达式rowid(ID, variable) ~ paste(ID, variable, sep="_")
从'long'改成'wide'。 rhs
~
的{{1}}列值在一起,而paste
获得ID变量列的序列ID。
rowid
在OP的代码中,表达式为library(data.table)
dcast(melt(setDT(DF2), id.var = "ID"), rowid(ID, variable) ~
paste(ID, variable, sep="_"))[, ID := NULL][]
# A_Freq A_Val B_Freq B_Val
#1: 1 1 1 2
#2: 2 2 2 3
#3: 3 4 3 4
#4: NA NA 4 5
#5: NA NA 5 8
,因此它将创建一个带有每个“值”元素的“值”列,并同时自动将value ~ ID
选为“值”导致行数超出预期