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

时间:2012-11-08 01:17:31

标签: r csv boxplot

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

我有一堆已导入R数据帧的.csv文件

我想从每个数据框中获取一个特定列(带有通用名称),将其合并到一个数据框中,并将数据框的名称作为列名称,并使用每列生成一个箱形图。 / p>

列的长度不同,通常包含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数据的新数据帧,每列将被命名为它来自的数据帧的名称。通过制作汤姆,鲍勃和斯图的并排箱图来实现(但我可以解决这个问题)。在上面所需的结果中将NA放在空白区域中是可以的。

2 个答案:

答案 0 :(得分:2)

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

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

enter image description here

答案 1 :(得分:1)

这是一种基本方法,在为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()

enter image description here

相关问题