将循环结果附加到R中的新列erorr

时间:2017-11-11 13:05:51

标签: r dataframe

我有两个数据框dat1dat2,如下所示:

head(dat1, 2)
# X     x                 sample    chromosome     a_b  coverage
# 1     91.4245014245     A1        1              a    NA
# 22    91.4245014245     A2        1              b    NA

head(dat2, 2)
# sample_id     coverage
# A1            8.439
# A2            0.673

问题:我想在sample中循环浏览每个dat1。然后查看它是否与sample_id中的任何dat2匹配,然后将coverage中相应的dat2 - 值附加到coverage - dat1中的值}。

我尝试了什么:这是我到目前为止所尝试的内容:

dat1 = read.csv("y_v_coverage.csv", header=T)
dat1$coverage = NA
dat1 = as.data.frame(dat1)

dat2 = read.csv("samples_x_coverage.csv", header=T)
dat2 = as.data.frame(dat2)

for (i in dat1$sample) {
    for (j in dat2$sample_id) {
        if (i == j) {
            dat1$coverage[i] = dat2$coverage[j]
        }
    }
}

但它一直给我以下错误:

  

$<-.data.frame中的错误(*tmp*,“coverage”,值= c(NA_integer_,:         替换有5924行,数据有5923

这个错误似乎有很多不同的含义,我似乎无法弄清楚它与我所做的有什么关系。通常,如果你没有创建一个充满NA的列,似乎会出现这个错误,但我已经这样做了。

2 个答案:

答案 0 :(得分:1)

您实际上是在尝试根据dat1dat2的值合并samplesample_id

您可以使用merge()合并两个数据框。在您的情况下,您必须指定要尝试合并的dat1dat2中的哪些列,因为这些列不具有相同的名称。这是由by.xby.y参数完成的:

merge(dat1, dat2, by.x="sample", by.y="sample_id", all.x=TRUE)
#      sample  X    x          chromosome a_b  coverage.x coverage.y
# 1     A1     1    91.4245    1          a    NA         8.439
# 2     A2     22   91.4245    1          b    NA         0.673

请注意,您只需删除为coverage创建的dat1列,您就会得到您正在寻找的内容:

#      sample  X    x         chromosome a_b   coverage
# 1     A1     1    91.4245   1          a     8.439
# 2     A2     22   91.4245   1          b     0.673

答案 1 :(得分:1)

合并将是更好的选择。您只需应用合并函数lije:

  

合并(df1,df2,by.x =&#34; sample&#34;,by.y =&#34; sample1&#34;,all.x = TRUE)

因此,我们正在定义,如果找不到任何东西,df1的所有观察应该在那里,不应该删除。