合并R中不同长度和缺少值的列

合并R中不同长度和缺少值的列,r,csv,boxplot,R,Csv,Boxplot,我有一个简单的问题,老实说,我试图找到一个答案。我真的做到了 我有一堆.csv文件,它们已经导入到R数据帧中 我想从每个数据帧中获取一个特定的列(具有公共名称),将其合并到一个数据帧中,并将该数据帧的名称作为列名,然后使用每个列生成一个箱线图 列的长度不同,通常包含NA 示例:数据帧(其中第一行是标题) 数据帧名称Tom: col1 col2 col3 col4 name1 33 44 55 name2 33 NA 55 name3 33 34 55 n

我有一个简单的问题,老实说,我试图找到一个答案。我真的做到了

我有一堆.csv文件,它们已经导入到R数据帧中

我想从每个数据帧中获取一个特定的列(具有公共名称),将其合并到一个数据帧中,并将该数据帧的名称作为列名,然后使用每个列生成一个箱线图

列的长度不同,通常包含NA

示例:数据帧(其中第一行是标题)

数据帧名称
Tom

col1    col2 col3 col4
name1   33   44   55
name2   33   NA   55
name3   33   34   55
name4   33   24   55
数据帧名称
Bob

col1    col2 col3 col4
name5   33   74   55
name6   33   NA   55
name7   33   32   55
数据帧名称
Stu

col1    col2 col3 col4
name8   33   44   55
name9   33   11   55
name10  33   34   55
name11  33   24   55
name12  33   32   55
name13  33   24   5
name14  33   34   55
name15  33   24   5
期望结果

Tom  Bob  Stu
44   74   44
NA   NA   11 
34   32   34
24        24
          32
          24
          34
          24

因此,从每个数据帧中获取“col3”(列名是共享的),并生成一个只包含col3数据的新数据帧,每个列将被命名为它所来自的数据帧的名称……然后生成一个并排的Tom、Bob和Stu的箱线图(但我可能可以解决这个问题)。将NA放在上面所需结果的空白处是可以的。

将data.frames放在命名列表中,
Hmisc
包中的
llist
在这里很有用

library(Hmisc)
data.list <- llist(Tom, Bob, Stu)
library(reshape2)
# get a long format version of col3
col3 <- melt(lapply(data.list, `[[`, 'col3'))
# the column `L1` contains the names Tom, Bob, Stu

library(ggplot2)
# create the boxplots

ggplot(col3, aes(x=L1, y= value)) + geom_boxplot()
库(Hmisc)

data.list这是一种基本方法,在向3个数据帧中的每一个添加标识符列后,我使用
rbind
创建一个新的组合数据帧。请注意,您也可以在不首先创建单个数据帧的情况下创建箱线图

Tom = read.table(header=TRUE,
text="col1    col2 col3 col4
name1   33   44   55
name2   33   NA   55
name3   33   34   55
name4   33   24   55")

Bob = read.table(header=TRUE,
text="col1    col2 col3 col4
name5   33   74   55
name6   33   NA   55
name7   33   32   55")

Stu = read.table(header=TRUE,
text="col1    col2 col3 col4
name8   33   44   55
name9   33   11   55
name10  33   34   55
name11  33   24   55
name12  33   32   55
name13  33   24   5
name14  33   34   55
name15  33   24   5")

# Add a new person identifier column to each data frame.
Tom$person = "Tom"
Bob$person = "Bob"
Stu$person = "Stu"

# Combine 3 data frames by row.
dat = rbind(Tom, Bob, Stu)

dat
#      col1 col2 col3 col4 person
# 1   name1   33   44   55    tom
# 2   name2   33   NA   55    tom
# 3   name3   33   34   55    tom
# 4   name4   33   24   55    tom
# 5   name5   33   74   55    bob
# 6   name6   33   NA   55    bob
# 7   name7   33   32   55    bob
# 8   name8   33   44   55    stu
# 9   name9   33   11   55    stu
# 10 name10   33   34   55    stu
# 11 name11   33   24   55    stu
# 12 name12   33   32   55    stu
# 13 name13   33   24    5    stu
# 14 name14   33   34   55    stu
# 15 name15   33   24    5    stu


boxplot(col3 ~ person, data=dat)

# This would also work, without rearranging the data:
boxplot(Tom[, "col3"], Bob[, "col3"], Stu[, "col3"])

# Save to pdf file.
pdf("boxplot_1.pdf", height=5, width=5)
boxplot(col3 ~ person, data=dat, main="Boxplot of three samples.", ylab="col3")
dev.off()

在我看来,将数据转换成长格式会使发送的数据更多?太好了,谢谢!这很好,我现在可以推断它来解决我一直遇到的其他问题。非常感谢,谢谢。。我试图用最少的非标准软件包来实现这一点,但我也会尝试一下。
Hmisc
ggplot2
reforme2
都是非常有用的、维护良好的非核心软件包。没错,但这是为了一个可能被能力甚至不如我的人使用的程序,所以我现在保持简单。