R 如何合并和聚合3+;不同长度和列名的数据帧
我有三个结构相似的数据帧,但有一个不同的列名和不同的行数R 如何合并和聚合3+;不同长度和列名的数据帧,r,merge,dataframe,aggregate,R,Merge,Dataframe,Aggregate,我有三个结构相似的数据帧,但有一个不同的列名和不同的行数 > a ID count alpha 1 207 1 1 2 351 1 1 3 372 1 1 4 595 4 1 5 596 1 1 6 652 1 1 > b ID count bet
> a
ID count alpha
1 207 1 1
2 351 1 1
3 372 1 1
4 595 4 1
5 596 1 1
6 652 1 1
> b
ID count beta
1 207 1 1
2 351 1 1
3 372 1 1
4 1024 6 1
> c
ID count zeta
1 207 4 1
2 351 1 1
3 372 1 1
4 595 2 1
我需要创建一个新的数据帧,其中包含来自这两个列的所有列(id、count、alpha、beta),同时输出count的和。如果一个ID只显示在一个数据帧中,它应该在相应的列中输出0。所需的输出如下:
> abc
ID count alpha beta zeta
1 207 6 1 1 1
2 351 3 1 1 1
3 372 3 1 1 1
4 595 6 1 0 1
5 596 1 1 0 0
6 652 1 1 0 0
7 1024 6 0 1 0
我在a和b上尝试了merge(),得到了以下输出:
> merge(a, b, by=intersect(names(a),names(b)), all=TRUE, sort=TRUE)
id count alpha beta
1 207 1 1 1
2 351 1 1 1
3 372 1 1 1
4 595 4 1 NA
5 596 1 1 NA
6 652 1 1 NA
7 1024 6 NA 1
我同意0是NA,但这个输出有两个主要问题:
> merge(a, b, by=intersect(names(a),names(b)), all=TRUE, sort=TRUE)
id count alpha beta
1 207 1 1 1
2 351 1 1 1
3 372 1 1 1
4 595 4 1 NA
5 596 1 1 NA
6 652 1 1 NA
7 1024 6 NA 1
(1) 计数列不求和
(2) merge()只处理2个数据帧,实际上我还有很多(比如10个)
欢迎您提供任何建议。以下是我的做法:
数据.frame的列表
(只需将它们全部放入列表()
)
rbindlist
(或另一个增强的rbind
函数之一,该函数允许您按行将数据集绑定在一起,即使列不同——请参阅“plyr”和“dplyr”,了解rbindlist
的其他常见替代方法)rbindlist
我不确定这是否正是你想要处理“alpha”、“beta”等列的方式。我刚刚总结了所有内容
本回答中使用的样本数据:
a <- structure(list(
ID = c(207L, 351L, 372L, 595L, 596L, 652L),
count = c(1L, 1L, 1L, 4L, 1L, 1L),
alpha = c(1L, 1L, 1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "alpha"),
class = "data.frame",
row.names = c("1", "2", "3", "4", "5", "6"))
b <- structure(list(
ID = c(207L, 351L, 372L, 1024L),
count = c(1L, 1L, 1L, 6L), beta = c(1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "beta"),
class = "data.frame", row.names = c("1", "2", "3", "4"))
c <- structure(list(
ID = c(207L, 351L, 372L, 595L),
count = c(4L, 1L, 1L, 2L), zeta = c(1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "zeta"),
class = "data.frame", row.names = c("1", "2", "3", "4"))
a以下是我的方法:
创建相关数据.frame的列表
(只需将它们全部放入列表()
)
使用rbindlist
(或另一个增强的rbind
函数之一,该函数允许您按行将数据集绑定在一起,即使列不同——请参阅“plyr”和“dplyr”,了解rbindlist
的其他常见替代方法)
在这里,我使用了“data.table”中的rbindlist
我不确定这是否正是你想要处理“alpha”、“beta”等列的方式。我刚刚总结了所有内容
本回答中使用的样本数据:
a <- structure(list(
ID = c(207L, 351L, 372L, 595L, 596L, 652L),
count = c(1L, 1L, 1L, 4L, 1L, 1L),
alpha = c(1L, 1L, 1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "alpha"),
class = "data.frame",
row.names = c("1", "2", "3", "4", "5", "6"))
b <- structure(list(
ID = c(207L, 351L, 372L, 1024L),
count = c(1L, 1L, 1L, 6L), beta = c(1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "beta"),
class = "data.frame", row.names = c("1", "2", "3", "4"))
c <- structure(list(
ID = c(207L, 351L, 372L, 595L),
count = c(4L, 1L, 1L, 2L), zeta = c(1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "zeta"),
class = "data.frame", row.names = c("1", "2", "3", "4"))
a以下是我的方法:
创建相关数据.frame的列表
(只需将它们全部放入列表()
)
使用rbindlist
(或另一个增强的rbind
函数之一,该函数允许您按行将数据集绑定在一起,即使列不同——请参阅“plyr”和“dplyr”,了解rbindlist
的其他常见替代方法)
在这里,我使用了“data.table”中的rbindlist
我不确定这是否正是你想要处理“alpha”、“beta”等列的方式。我刚刚总结了所有内容
本回答中使用的样本数据:
a <- structure(list(
ID = c(207L, 351L, 372L, 595L, 596L, 652L),
count = c(1L, 1L, 1L, 4L, 1L, 1L),
alpha = c(1L, 1L, 1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "alpha"),
class = "data.frame",
row.names = c("1", "2", "3", "4", "5", "6"))
b <- structure(list(
ID = c(207L, 351L, 372L, 1024L),
count = c(1L, 1L, 1L, 6L), beta = c(1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "beta"),
class = "data.frame", row.names = c("1", "2", "3", "4"))
c <- structure(list(
ID = c(207L, 351L, 372L, 595L),
count = c(4L, 1L, 1L, 2L), zeta = c(1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "zeta"),
class = "data.frame", row.names = c("1", "2", "3", "4"))
a以下是我的方法:
创建相关数据.frame的列表
(只需将它们全部放入列表()
)
使用rbindlist
(或另一个增强的rbind
函数之一,该函数允许您按行将数据集绑定在一起,即使列不同——请参阅“plyr”和“dplyr”,了解rbindlist
的其他常见替代方法)
在这里,我使用了“data.table”中的rbindlist
我不确定这是否正是你想要处理“alpha”、“beta”等列的方式。我刚刚总结了所有内容
本回答中使用的样本数据:
a <- structure(list(
ID = c(207L, 351L, 372L, 595L, 596L, 652L),
count = c(1L, 1L, 1L, 4L, 1L, 1L),
alpha = c(1L, 1L, 1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "alpha"),
class = "data.frame",
row.names = c("1", "2", "3", "4", "5", "6"))
b <- structure(list(
ID = c(207L, 351L, 372L, 1024L),
count = c(1L, 1L, 1L, 6L), beta = c(1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "beta"),
class = "data.frame", row.names = c("1", "2", "3", "4"))
c <- structure(list(
ID = c(207L, 351L, 372L, 595L),
count = c(4L, 1L, 1L, 2L), zeta = c(1L, 1L, 1L, 1L)),
.Names = c("ID", "count", "zeta"),
class = "data.frame", row.names = c("1", "2", "3", "4"))
a这可以分阶段使用dplyr
完成
给定数据:
dfA <- data.frame(c(207, 351, 372, 595, 596, 652), c(1, 1, 1, 4, 1, 1), rep(1, 6))
names(dfA) <- c('ID', 'count', 'alpha')
dfB <- data.frame(c(207, 351, 372, 1024), c(1, 1, 1, 6), rep(1, 4))
names(dfB) <- c('ID', 'count', 'beta')
dfC <- data.frame(c(207, 351, 372, 595), c(4, 1, 1, 2), rep(1, 4))
names(dfC) <- c('ID', 'count', 'zeta')
dfA这可以分阶段使用dplyr
完成
给定数据:
dfA <- data.frame(c(207, 351, 372, 595, 596, 652), c(1, 1, 1, 4, 1, 1), rep(1, 6))
names(dfA) <- c('ID', 'count', 'alpha')
dfB <- data.frame(c(207, 351, 372, 1024), c(1, 1, 1, 6), rep(1, 4))
names(dfB) <- c('ID', 'count', 'beta')
dfC <- data.frame(c(207, 351, 372, 595), c(4, 1, 1, 2), rep(1, 4))
names(dfC) <- c('ID', 'count', 'zeta')
dfA这可以分阶段使用dplyr
完成
给定数据:
dfA <- data.frame(c(207, 351, 372, 595, 596, 652), c(1, 1, 1, 4, 1, 1), rep(1, 6))
names(dfA) <- c('ID', 'count', 'alpha')
dfB <- data.frame(c(207, 351, 372, 1024), c(1, 1, 1, 6), rep(1, 4))
names(dfB) <- c('ID', 'count', 'beta')
dfC <- data.frame(c(207, 351, 372, 595), c(4, 1, 1, 2), rep(1, 4))
names(dfC) <- c('ID', 'count', 'zeta')
dfA这可以分阶段使用dplyr
完成
给定数据:
dfA <- data.frame(c(207, 351, 372, 595, 596, 652), c(1, 1, 1, 4, 1, 1), rep(1, 6))
names(dfA) <- c('ID', 'count', 'alpha')
dfB <- data.frame(c(207, 351, 372, 1024), c(1, 1, 1, 6), rep(1, 4))
names(dfB) <- c('ID', 'count', 'beta')
dfC <- data.frame(c(207, 351, 372, 595), c(4, 1, 1, 2), rep(1, 4))
names(dfC) <- c('ID', 'count', 'zeta')
dfA为什么不作为下一步进行聚合?我已经丢失了$count中包含的信息,不是吗?你可以编写另一个合并函数:merge2哦。我知道你指的是什么。也许可以使用一个接受不同列的rbind函数,然后聚合该输出。你能添加一些关于如何不使用的详细信息吗o处理“alpha”和“beta”列。在不同的数据框中是否有不同的列?是否有同时包含“alpha”和“beta”的列?为什么不作为下一步进行聚合?我已经丢失了$count中计数的信息,不是吗?困惑你可以编写另一个合并函数:merge2哦。我明白你的意思。也许可以使用一个rbind函数来接受不同的列,然后聚合输出。你能添加一些关于如何处理wi的详细信息吗“alpha”和“beta”列。在不同的数据框中是否有不同的列?是否有同时包含“alpha”和“beta”的列?为什么不作为下一步进行聚合?我已经丢失了$count中计数的信息,不是吗?困惑你可以编写另一个合并函数:merge2哦。我明白你的意思。也许可以使用一个rbind函数来接受不同的列,然后聚合输出。你能添加一些关于如何处理wi的详细信息吗“alpha”和“beta”列。在不同的数据框中是否有不同的列?是否有同时包含“alpha”和“beta”的列?为什么不作为下一步进行聚合?我已经丢失了$count中计数的信息,不是吗?困惑你可以编写另一个合并函数:merge2哦。我明白你的意思。也许可以使用一个rbind函数来接受不同的列,然后聚合输出。你能添加一些关于如何处理wi的详细信息吗“alpha”和“beta”列。在不同的数据框中是否有不同的列?是否有些列同时有“alpha”和“beta”?通过bind_行(dfA,dfB,dfC)%%>%group_by(ID)%%>%总结每个行(funs(sum(,na.rm=TRUE)),可以节省大量的键入时间
@Khashaa,是的,你会的;当然是一个更干净的电话。我需要在我的\u每个
-fu中温习一下。谢谢你。谢谢