合并R中不同长度和缺少值的列
我有一个简单的问题,老实说,我试图找到一个答案。我真的做到了 我有一堆.csv文件,它们已经导入到R数据帧中 我想从每个数据帧中获取一个特定的列(具有公共名称),将其合并到一个数据帧中,并将该数据帧的名称作为列名,然后使用每个列生成一个箱线图 列的长度不同,通常包含NA 示例:数据帧(其中第一行是标题) 数据帧名称合并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
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
都是非常有用的、维护良好的非核心软件包。没错,但这是为了一个可能被能力甚至不如我的人使用的程序,所以我现在保持简单。