1

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

我有一堆 .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。

4

2 回答 2

2

将你的 data.frames 放在一个命名列表中,llistHmisc包中在这里很有用

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

在此处输入图像描述

于 2012-11-08T01:33:35.497 回答
1

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

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

在此处输入图像描述

于 2012-11-08T01:48:21.460 回答