【问题标题】:Adding a one dataframe to the end of another data.frame in R将一个数据帧添加到 R 中另一个 data.frame 的末尾
【发布时间】:2020-02-23 17:48:42
【问题描述】:

我很难将一个添加到另一个数据框的底部。

我有一个数据框(我们称之为 DF1),它有 1 行和 5 列。我有另一个数据框(我们称之为 DF2),它有 50 行和 5 列。我将其设置为使两个数据框之间的列匹配-它们具有相同的列。其实DF1是基于DF2的计算。

这就是 DF1 的样子:

   row.names     pt1     pt2     pt3     pt4
   calc          0.93    0.45    0.28    0.54

这就是 DF2 的样子:

   row.names     pt1     pt2     pt3     pt4
   SNP1          AA      AG      AG      AA       
   SNP2          CT      CT      TC      CC
   SNP3          GG      CG      CG     <NA>
   SNP4          AA      GG      AG      AA
   SNP5         <NA>    <NA>    <NA>    <NA>

DF1 应该是实际数据点的数量(未丢失的值的数量)除以可能值的总数。

所以.. 我想将 DF1 添加到 DF2 的底部,如下所示:

   row.names     pt1     pt2     pt3     pt4
   SNP1          AA      AG      AG      AA       
   SNP2          CT      CT      TC      CC
   SNP3          GG      CG      CG     <NA>
   SNP4          AA      GG      AG      AA
   SNP5         <NA>    <NA>    <NA>    <NA>
   calc          0.93    0.45    0.28    0.54

当我尝试使用时

 both.dfs <- rbind(DF1, DF2)  # DF1 is first here

DF1 是 DF2 中的第一行。我需要它是最后一行。

当我尝试使用时

both.dfs <- rbind(DF2, DF1)  # DF2 is first here

我得到一个错误:

Warning messages:
1: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) :
  invalid factor level, NAs generated
2: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) :
  invalid factor level, NAs generated
3: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) :
  invalid factor level, NAs generated
4: In `[<-.factor`(`*tmp*`, iseq, value = 0.74) :
  invalid factor level, NAs generated

我尝试过合并,我尝试向 DF2 添加一个新行,然后插入 DF2 的值……似乎没有任何效果!我迫切需要一些帮助!任何人?

【问题讨论】:

  • 简短的回答是你不能(或者至少你不应该)。数据帧的列必须都是原子向量(即相同的数据类型),并且您正在尝试混合数字(DF1)和字符/因子(DF2)。
  • 如果 DF2 的列是字符而不是因子,它将“起作用”。但是您可能仍然应该找到一种不同的方式来链接这些数据集。

标签: r dataframe rows


【解决方案1】:

这是你应该做的:

DFtranspose <- cbind(t(DF1[2, ]), t(DF2))
rownames(DFtranspose) <- DF1[1, ]

【讨论】:

    【解决方案2】:

    只要你处理的是数据帧,你就可以使用 rbind():

    bothdfs <- rbind(df1, df2)
    

    列名将被自动保留。

    【讨论】:

      【解决方案3】:

      我同意 cmets 的观点,这可能是个坏主意,但您可以这样做。

      首先,基于列表的 data.frame 不会以这种方式很好地结合起来。如果要 rbind 数据,最好将它们转换为矩阵。请注意,您必须为数据框的每一行选择一种类型,因此如果数字绑定到字符,则不能将它们保留为数字。如果你愿意把一切都当作一个角色,那就试试吧:

      > df1 <- data.frame(pt1="a", pt2="b", row.names=1)
      > rownames(df1) <- "e"
      > df2 <- data.frame(letters[1:4], pt1=1:4, pt2=2:5, row.names=1)
      > rbind(as.matrix(df2), as.matrix(df1))
        pt1 pt2
      a "1" "2"
      b "2" "3"
      c "3" "4"
      d "4" "5"
      e "a" "b"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 2020-08-20
        • 1970-01-01
        相关资源
        最近更新 更多