如何组合两个数据帧的更大数据帧,但某些行具有缺失值(详情如下)

时间:2017-07-31 15:24:45

标签: r

以下是一些假设数据。这可能看起来像一个愚蠢的例子,但我认为它得到了这个想法。因此,我正在寻找不同地点(想想国家或其他)的年龄和身高之间的相关性,但我是按性别分开的。首先,我正在检查以确保性别之间的年龄是可比较的运行Wilcox.test。这是一个假设的输出,我添加了一个额外的列,告诉我年龄是否在统计上不同/可比较。

Location    Age comparison p value (wilcox.test)    Age comparable (p =.05)?
A   0.04    no
B   0.07    yes
C   0.09    yes
D   0.1 yes
E   0.02    no
F   0.03    no
H   0.78    yes

然后我运行了一个Spearman cor.test,但是对于那些在每个位置收集数据的男性和女性的n是2或更少,所以它不能在某些位置运行,给我一个示例输出:

男性年龄与身高的相关性

Location    Correlation p value (cor.test, pearson) Correlation present?
A   0.04    yes
B   0.17    no
H   0.47    no

女性的年龄和身高之间的相关性

Location    Correlation p value (cor.test, pearson) Correlation present?
C   0.08    no
D   0.03    yes
E   0.19    no
F   0.17    no
H   0.23    no

现在,我想将这些数据(年龄比较和相关性)合并到一个数据框中,以便于分析数据。这是我想要输出的内容:

    Location    Age comparison p value (wilcox.test)    Age comparable (p =.05)?    cor.test p value (male)     cor.test p value (female)   
    A   0.04    no  0.04    yes na  na
    B   0.07    yes 0.17    no  na  na
    C   0.09    yes na  na  0.08    no
    D   0.1 yes na  na  0.03    yes
    E   0.02    no  na  na  0.19    no
    F   0.03    no  na  na  0.17    no
    H   0.78    yes 0.47    no  0.23    no

但是,由于n太小,我不确定如何排列输出,输入必要的na。

请指导我完成这个过程吗?这是我的第一个问题,如果格式不正确/不清楚,请对不起。如果您有任何疑问,请不要犹豫,问:)

谢谢!

1 个答案:

答案 0 :(得分:0)

正如@Mako所提到的,你正在寻找的是"加入"或者在R用语中的merge()

我冒昧地缩短了列名。

male <- read.table(text="
  Location    p corr
  A   0.04    yes
  B   0.17    no
  H   0.47    no", header=TRUE)

female <- read.table(text="
  Location    p corr
  C   0.08    no
  D   0.03    yes
  E   0.19    no
  F   0.17    no
  H   0.23    no", header=TRUE)

merge(x=male, y=female, by="Location", all=TRUE, suffixes=c("_male", "_female"))

#   Location p_male corr_male p_female corr_female
# 1        A   0.04       yes       NA        <NA>
# 2        B   0.17        no       NA        <NA>
# 3        H   0.47        no     0.23          no
# 4        C     NA      <NA>     0.08          no
# 5        D     NA      <NA>     0.03         yes
# 6        E     NA      <NA>     0.19          no
# 7        F     NA      <NA>     0.17          no

对于两个以上的数据框,您可以将Reduce()merge()结合使用。没有使用此方法应用后缀的简洁方法,但默认情况下,列的顺序是与您提供数据帧的顺序相同。

na <- read.table(text="
  Location    p corr
  A   0.07    no
  D   0.02    yes
  E   0.18    no
  F   0.16    no", header=TRUE)

Reduce(function(...) merge(..., by="Location", all=TRUE), list(female, male, na))
#   Location  p.x corr.x  p.y corr.y    p corr
# 1        C 0.08     no   NA   <NA>   NA <NA>
# 2        D 0.03    yes   NA   <NA> 0.02  yes
# 3        E 0.19     no   NA   <NA> 0.18   no
# 4        F 0.17     no   NA   <NA> 0.16   no
# 5        H 0.23     no 0.47     no   NA <NA>
# 6        A   NA   <NA> 0.04    yes 0.07   no
# 7        B   NA   <NA> 0.17     no   NA <NA>