在 R 中重铸给出不同的值
Recast in R gives different value
我在 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 的其他变体,但无法获得所需的结果。求人帮忙
一个选项是
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"(作为字符串)来从 'wide' 转换为 'long' 格式。然后使用 dcast
,使用表达式 rowid(ID, variable) ~ paste(ID, variable, sep="_")
从 'long' 重塑为 'wide'。 rhs
的~
和paste
的列值在一起,而rowid
得到序列id为ID,变量列。
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
在 OP 的代码中,表达式是 value ~ ID
,因此它使用 'value' 的每个唯一元素创建一个列 'value',同时自动选择 value.var
as 'value' 导致比预期更多的行
我在 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 的其他变体,但无法获得所需的结果。求人帮忙
一个选项是
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"(作为字符串)来从 'wide' 转换为 'long' 格式。然后使用 dcast
,使用表达式 rowid(ID, variable) ~ paste(ID, variable, sep="_")
从 'long' 重塑为 'wide'。 rhs
的~
和paste
的列值在一起,而rowid
得到序列id为ID,变量列。
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
在 OP 的代码中,表达式是 value ~ ID
,因此它使用 'value' 的每个唯一元素创建一个列 'value',同时自动选择 value.var
as 'value' 导致比预期更多的行