【问题标题】:Bind_rows over 3 dataframes, resulting in error (Argument 1 must have names)Bind_rows 超过 3 个数据帧,导致错误(参数 1 必须有名称)
【发布时间】:2021-10-15 03:14:47
【问题描述】:

我有 3 个这样的数据集

**DF1**                            
        pt1     pt2            
A       1.5     2.2   

**DF2**
        pt1      pt2      pt3  
B       40       22       23  


**DF3**
        pt2      pt3      pt4      pt5
C       23       43       12       65 
D       12       04       13       34


IDEAL OUTPUT

        pt1      pt2      pt3      pt4     pt5
A       1.5      2.2      NA       NA      NA
B       0        22       23       NA      NA
C       NA       23       43       12      65
D       NA       12       04       13      34

当我尝试 bind_rows 但是我得到了这个错误

df_list <- list(DF1, DF2, DF3)

df <- dplyr::bind_rows(df_list)

Error: Argument 1 must have names

我曾尝试查找此内容,但一直陷入死胡同。为什么会出现此错误,我该如何解决?

【问题讨论】:

  • 您能否打印应用于 3 个数据帧中的每一个的 dput 的输出?我相信像purrr::reduce(df_list, dplyr::bind_rows) 这样的东西应该可以工作
  • 我无法重现您的问题,bind_rows(df1,df2,df3)(不是您尝试过的)和bind_rows(list(df1,df2,df3)) 都为我工作而没有错误。要知道为什么会发生这种情况,拥有框架的“真实”明确结构将是有益的。请在每个df* 上使用dput(.) 并在您的问题中发布输出。谢谢!
  • 查看这篇文章:stackoverflow.com/questions/52505923/… 这可能是您的一个或多个 dfs 是根据未命名的列表构建的,可能是第一列大写字母。
  • 我确实认为命名问题是问题所在。我有数千列,有没有办法可以发布缩写的 dput?
  • dput(dat[1:3,1:5])?

标签: r dplyr


【解决方案1】:

理论上,您的代码可以工作。

df1 <- data.frame(a = 1, b = 1)
df2 <- data.frame(b = 2, c = 2)
df3 <- data.frame(c = 3, d = 3)

dplyr::bind_rows(df1,df2, df3)

提供以下输出

   a  b  c  d
1  1  1 NA NA
2 NA  2  2 NA
3 NA NA  3  3

Error: Argument 1 must have names 在您不使用命名结构时出现。您能否通过检查它们来确认您的数据框确实是数据框

names(df1)

如果你得到NULL,那就是问题所在。


根据您的评论。如果您使用t() 函数,它不会输出数据帧,因此您需要将其显式转换为数据帧。

dta %&gt;% t() %&gt;% as.data.frame()

【讨论】:

  • 我确实为 df1 和 df2.... dput 在上面的 cmets 中得到了 null....edit: null for all 3 dfs
  • 在您最后的评论中,确保最后一个产品是一个数据框,而不仅仅是一个矩阵/字符。 df1 &lt;- df %&gt;% select(A) %&gt;% t() %&gt;% as.data.frame()。 t() 函数输出一个矩阵/向量
  • 现在我想我有一个不同的问题,上面写着Error: Can't combine `..1$A` &lt;double&gt; and `..2$A` &lt;character&gt;. 我可以问这是一个不同的问题线程,除非你认为这是一个简单的答案。谢谢!
  • 您需要确保它们都是一致的类型。更安全的做法是使用as.character() 将 1$A 转换为字符,然后绑定行。
  • 谢谢,不过我预见问题出在多列上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2019-03-01
  • 2021-09-14
  • 1970-01-01
  • 2019-09-28
  • 2021-02-09
  • 1970-01-01
相关资源
最近更新 更多