这是我的第一个问题,它与R coode有关。
我的情况是我有50(10X10)个数据帧。这些是各种日期的项目和计数。两个矩阵的简化示例:
> Day1
name count
1 Item1 231
2 Item2 222
3 Item3 453
> dim(Day1)
[1] 3 2
> str(Day1)
'data.frame': 3 obs. of 2 variables:
$ name : Factor w/ 3 levels "Item1","Item2",..: 1 2 3
$ count: num 231 222 453
> Day2
name count
1 Item1 111
2 Item4 765
3 Item3 212
所以合并应该如下所示:
> Total
name D1 D2
1 Item1 231 111
2 Item2 222 0
3 Item3 453 212
4 Item4 0 765
>
所以从本质上讲,矩阵'我有,每一个可能有或没有相同的项目名称,但目标是让他们在一个矩阵/视图中,他们看到项目如何计数上升/下降等。 [建议使用图表,图表等来显示数据中的有用信息]
答案 0 :(得分:1)
尝试:
library(plyr)
nm1 <- ls(pattern="^Day")
nm2 <- gsub("^(.).*(\\d)$", "\\1\\2", nm1)
res <- join_all(Map(function(x,y) {names(x)[2] <- y;x},
mget(nm1), nm2), type="full")
res[is.na(res)] <- 0
res
# Name D1 D2
#1 Item1 231 111
#2 Item2 222 0
#3 Item3 453 212
#4 Item4 0 765
Day1 <- structure(list(Name = c("Item1", "Item2", "Item3"), Count = c(231L,
222L, 453L)), .Names = c("Name", "Count"), class = "data.frame", row.names = c(NA,
-3L))
Day2 <- structure(list(Name = c("Item1", "Item4", "Item3"), Count = c(111L,
765L, 212L)), .Names = c("Name", "Count"), class = "data.frame", row.names = c(NA,
-3L))
答案 1 :(得分:1)
你不需要包裹。使用akrun的数据:
datlist <- mget(ls(pattern="^Day"))
dat <- Reduce(function(DF1, DF2) merge(DF1, DF2, by = "Name", all=TRUE), datlist)
names(dat)[-1] <- names(datlist)
dat[,-1] <- lapply(dat[,-1], function(x) {
x[is.na(x)] <- 0
x
})
# Name Day1 Day2
#1 Item1 231 111
#2 Item2 222 0
#3 Item3 453 212
#4 Item4 0 765
答案 2 :(得分:0)
尝试:
dflist = list(Day1, Day2)
dflist
for(i in 1:length(dflist)) {
dflist[[i]]$day = paste0('Day',i)
}
merged = dflist[[1]]
for(i in 2:length(dflist)){
merged = rbind(merged, dflist[[i]])
}
merged
Name Count day
1 Item1 231 Day1
2 Item2 222 Day1
3 Item3 453 Day1
4 Item1 111 Day2
5 Item4 765 Day2
6 Item3 212 Day2
dcast(merged, Name~day, value.var="Count")
Name Day1 Day2
1 Item1 231 111
2 Item2 222 NA
3 Item3 453 212
4 Item4 NA 765