我有一个简单的问题,说实话,我试图找到答案。我真的做到了。
我有一堆已导入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放在空白区域中是可以的。
答案 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()
答案 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()