我有两个数据框dat1
和dat2
,如下所示:
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的列,似乎会出现这个错误,但我已经这样做了。
答案 0 :(得分:1)
您实际上是在尝试根据dat1
和dat2
的值合并sample
和sample_id
。
您可以使用merge()
合并两个数据框。在您的情况下,您必须指定要尝试合并的dat1
和dat2
中的哪些列,因为这些列不具有相同的名称。这是由by.x
和by.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的所有观察应该在那里,不应该删除。