如何将多个不同长度的列表合并到一个表中?

时间:2019-07-17 23:03:36

标签: r

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

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

payload

我得到这个结果:

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 

尝试执行as.data.frame会产生此错误:

  

my_df <-as.data.frame(my_list)   错误(函数(...,row.names = NULL,check.rows = FALSE,check.names = TRUE,:     参数暗示不同的行数:

3 个答案:

答案 0 :(得分:6)

您可以从基数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

答案 1 :(得分:1)

一个选项:

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")
)

答案 2 :(得分:0)

这将是一种实现方式:

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)