【问题标题】:How do I combine multiple lists of different lengths into one table? [duplicate]如何将多个不同长度的列表合并到一张表中? [复制]
【发布时间】:2019-07-17 23:03:36
【问题描述】:

我有一个包含多种处理的数据集,我使用 read.csv 将其导入 R。然后我对数据进行了处理(以各种方式对其进行了标准化),现在我的 4 种治疗(listA、listB、listC、listD)有 4 个独立的标准化观察列表。这些数据不是成对的,而是代表独立的观察结果(例如,a = 5 和 b = 6 中的样本量)。我想将这些列表组合成一个新的数据文件(可能是 .csv 或数据框),我可以从中进行统计(ANOVA)和绘图(箱线图)。最终的数据集不应该是一个简单地将所有值附加到一个列表中的列表,而是应该根据它来自哪个列表在一列中列出每个值。例如。 一个 5.5 一个 5 4.8 一个 5.5 一个 5.3 b 2.2 b 3.1 等等

我已尝试追加,但输出仅列出了值,而不是值旁边的样本名称 (a - d)。

my_list <- list(a= listA, b= listB, c= listC, d=listD)
my_list

我得到这个结果:

$a
 [1]  5.5 5 4.8  5.5  5.3  5.5  5.3
$b
 [1]  2.2 3.1 

但我想看一个有两列的表格

a 5.5
a 5
a 4.8
a 5.5
a 5.3
b 2.2
b 3.1
etc.

试图做 as.data.frame 会产生这个错误:

my_df

【问题讨论】:

标签: r


【解决方案1】:

您可以使用基础 R 中的堆栈 -

my_list <- list(a= c(5.5, 5, 4.8,  5.5,  5.3,  5.5,  5.3),
                b = c(2.2, 3.1))

stack(my_list)

  values ind
1    5.5   a
2    5.0   a
3    4.8   a
4    5.5   a
5    5.3   a
6    5.5   a
7    5.3   a
8    2.2   b
9    3.1   b

【讨论】:

    【解决方案2】:

    一个选项:

    library(dplyr)
    
    listA <- c(5, 3, 7)
    listB <- c(2, 4)
    
    bind_rows(
      enframe(listA, name = NULL) %>% mutate(df = "a"),
      enframe(listB, name = NULL) %>% mutate(df = "b")
    )
    

    【讨论】:

      【解决方案3】:

      这是一种方法:

      x=(unlist(my_list))
      df=data.frame(treatment=substring(names(x),1,1), #the substring chops off the numerical part from the names given by unlist
                    values=x)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        • 1970-01-01
        • 2021-04-04
        相关资源
        最近更新 更多