我有一个包含大量行和列的数据框,但是对于这个特定的练习,我只需要两列用于该数据框。例如,我有这个:
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合并两个数据框,但是有一个额外的列告诉我每个数据框的百分比,如果没有找到则放零,如下所示:
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
也许这不是完全合并,但这只是我想到的。
有什么想法吗?
谢谢!
答案 0 :(得分:2)
您必须将第二个数据帧从long转换为宽(请参阅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
答案 1 :(得分:1)
以下是使用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")