【问题标题】:Merge columns of different length and missing values in R合并R中不同长度和缺失值的列
【发布时间】:2012-11-08 01:17:31
【问题描述】:

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

我有一堆 .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 数据的新数据帧,每一列将被命名为它来自的数据帧的名称.. . 其次是制作汤姆、鲍勃和斯图的并排箱线图(但我可能可以解决这个问题)。在上面想要的结果中的空白处有 NA 是可以的。

【问题讨论】:

  • 在我看来,将数据变成长格式会发送更多?

标签: r csv boxplot


【解决方案1】:

把你的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()

【讨论】:

  • 谢谢.. 我正在尝试使用最少的非标准软件包,但我也会尝试。
  • Hmiscggplot2reshape2 都是非常有用且维护良好的非核心软件包。
  • 是的,但这是一个程序,希望能被比我能力差的人使用,所以我暂时保持简单。
【解决方案2】:

这是一种基本方法,在将标识符列添加到 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()

【讨论】:

  • 完美,谢谢!这很好用,我现在可以推断它来解决我一直遇到的其他问题。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多