R 在另一个数据框的列上匹配数据框中的列,如果它们匹配,则添加新列
我有两个大数据帧,其中一个(df1)具有这种结构R 在另一个数据框的列上匹配数据框中的列,如果它们匹配,则添加新列,r,dataframe,multiple-columns,matching,R,Dataframe,Multiple Columns,Matching,我有两个大数据帧,其中一个(df1)具有这种结构 V1 V2 V3 1 Chr1 7507 10944 2 Chr1 10944 13170 3 Chr1 13170 20065 4 Chr1 20065 28273 5 Chr1 28273 29960 6 Chr1 29960 36599 7 Chr1 36599 37513 8 Chr1 37513 40360 9 Chr1 40360 48796 10 Chr1 48796 50661 另一个(d
V1 V2 V3
1 Chr1 7507 10944
2 Chr1 10944 13170
3 Chr1 13170 20065
4 Chr1 20065 28273
5 Chr1 28273 29960
6 Chr1 29960 36599
7 Chr1 36599 37513
8 Chr1 37513 40360
9 Chr1 40360 48796
10 Chr1 48796 50661
另一个(df2)是这样的
我试图做的是检查df2的V2或V3列(相同)是否=或在df1的V2和V3范围内,如果不写入0,我想在df1的新列中写入df2的V5值。我想要的结果是:
Chr1 7507 10944 1
Chr1 10944 13170 2
Chr1 13170 20065 22
Chr1 20065 28273 3
Chr1 28273 29960 161
Chr1 29960 36599 10
Chr1 36599 37513 604
Chr1 37513 40360 117
Chr1 40360 48796 8
.
.
.
你知道有什么好办法吗?
非常感谢。正如@初学者在评论中已经提到的那样,
df2
的所有V2
和V3
值都与df1
的V2
精确匹配。如果我正确地解释了你的问题,这可能不是你想要的。下面的例子就是我想你要找的
读取两个数据帧:
df1 <- read.table(header=TRUE, text="rn V1 V2 V3
1 Chr1 7507 10944
2 Chr1 10944 13170
3 Chr1 13170 20065
4 Chr1 20065 28273
5 Chr1 28273 29960
6 Chr1 29960 36599
7 Chr1 36599 37513
8 Chr1 37513 40360
9 Chr1 40360 48796
10 Chr1 48796 50661")
df2 <- read.table(header=TRUE, text="rn V1 V2 V3 V4 V5
1 Chr1 7507 7507 1 1
2 Chr1 10944 10944 1 2
3 Chr1 13170 13170 1 22
4 Chr1 20065 20065 1 3
5 Chr1 28273 28273 1 161
6 Chr1 29960 29960 1 10
7 Chr1 36599 36599 1 604
8 Chr1 37513 37513 1 117
9 Chr1 40360 40360 1 8
10 Chr1 48796 48796 1 3")
我认为您需要使用
合并。您可以在R帮助文件(?merge
)中查看示例。在您的示例中,df2的所有V2和V3值在df1的V2中都精确匹配。如果这适用于您的整个数据,那么@dickoa建议的相对简单的合并
是合适的。如果您的实际数据不同(因此您需要检查范围),如果您还可以编辑您的示例数据,那就更好了非常感谢您的回答Jaap和@初学者!!基于此,我不得不修改一些元素,我做到了!我们必须注意更多的参数!所以现在的代码是
df1 <- read.table(header=TRUE, text="rn V1 V2 V3
1 Chr1 7507 10944
2 Chr1 10944 13170
3 Chr1 13170 20065
4 Chr1 20065 28273
5 Chr1 28273 29960
6 Chr1 29960 36599
7 Chr1 36599 37513
8 Chr1 37513 40360
9 Chr1 40360 48796
10 Chr1 48796 50661")
df2 <- read.table(header=TRUE, text="rn V1 V2 V3 V4 V5
1 Chr1 7507 7507 1 1
2 Chr1 10944 10944 1 2
3 Chr1 13170 13170 1 22
4 Chr1 20065 20065 1 3
5 Chr1 28273 28273 1 161
6 Chr1 29960 29960 1 10
7 Chr1 36599 36599 1 604
8 Chr1 37513 37513 1 117
9 Chr1 40360 40360 1 8
10 Chr1 48796 48796 1 3")
df2 <- df2[,-4]
df2$V2 <- df2$V2 + 2000
df1$V4 <- ifelse(df2$V2 >= df1$V2 & df2$V2 <= df1$V3, df2$V5, 0)