Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何合并和聚合3+;不同长度和列名的数据帧_R_Merge_Dataframe_Aggregate - Fatal编程技术网

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
    的其他常见替代方法)
  • 在这里,我使用了“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以下是我的方法:

  • 创建相关
    数据.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中温习一下。谢谢你。谢谢