我有一个有很多行和列的数据框架,但是对于这个特定的练习,我只需要两个列来表示这个数据框架。例如,我有这样的想法:
ID Amount
1 7 100
2 6 495
3 85 550
4 64 600
5 3 150
我还有另一个数据框架,它也有很多行和列,但是我只需要三列:
ID Perc Type
1 7 0.05 A
2 6 0.50 A
3 85 0.75 A
4 7 0.90 B
5 64 0.30 C
6 3 0.50 A
7 64 0.40 A
我需要做的是根据ID合并这两个数据帧,但是有一个额外的列,它告诉我每个数据帧的百分比,如果找不到,则将0放在零,如下所示:
ID Amount A B C
1 7 100 0.05 0.9 0.0
2 6 495 0.50 0.0 0.0
3 85 550 0.75 0.0 0.0
4 64 600 0.40 0.0 0.3
5 3 150 0.50 0.0 0.0
也许这并不是真正的合并,但这才是我脑海中唯一想到的。
有什么想法吗?
谢谢!
发布于 2017-07-21 18:43:45
您必须将第二个数据框架从long转换为wide (请参阅package reshape2以便于使用),然后将其结果合并到第一个。
做以下工作:
library(reshape2)
# Transform from long to wide
df2_wide = dcast(df2, ID ~ Type, value.var = "Perc")
# Set NAs to 0
df2_wide[is.na(df2_wide)] = 0
# Merge both data frames
df3 = merge(df1,df2_wide)
其中,df2
是您的第二个数据帧,df1
是第一个数据帧。
结果:
ID Amount A B C
1 3 150 0.50 0.0 0.0
2 6 495 0.50 0.0 0.0
3 7 100 0.05 0.9 0.0
4 64 600 0.40 0.0 0.3
5 85 550 0.75 0.0 0.0
发布于 2017-07-21 18:46:36
下面是使用tidyr
和dplyr
包的解决方案
df1<-structure(list(ID = c(7L, 6L, 85L, 64L, 3L), Amount = c(100L, 495L, 550L, 600L, 150L)),
.Names = c("ID", "Amount"), class = "data.frame", row.names = c("1", "2", "3", "4", "5"))
df2<-structure(list(ID = c(7L, 6L, 85L, 7L, 64L, 3L, 64L), Perc = c(0.05, 0.5, 0.75, 0.9, 0.3, 0.5, 0.4),
Type = structure(c(1L, 1L, 1L, 2L, 3L, 1L, 1L),
.Label = c("A", "B", "C"), class = "factor")),
.Names = c("ID", "Perc", "Type"), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7"))
library(tidyr)
#go from long to wide format
df2w<-spread(df2, Type, Perc, fill=0)
library(dplyr)
#merge the 2 data frames together
final answer<-left_join(df2w, df1, by="ID")
https://stackoverflow.com/questions/45249947
复制