R 为另一列的值更改一列的值
我有两个数据集,如下所示:R 为另一列的值更改一列的值,r,multiple-columns,R,Multiple Columns,我有两个数据集,如下所示: df1 <- data.frame(name=c("ab23242", "ab35366", "ab47490", "ab59614"), X=c(72722, 88283, 99999, 114278.333)) df2 <- data.frame(name=c("ab35366", "ab47490", "ab59614", "ab23242" ), X=c(12345, 23456
df1 <- data.frame(name=c("ab23242", "ab35366", "ab47490", "ab59614"),
X=c(72722, 88283, 99999, 114278.333))
df2 <- data.frame(name=c("ab35366", "ab47490", "ab59614", "ab23242" ),
X=c(12345, 23456, 34567, 456789))
df.merge <- merge(df1, df2, by="name", all.x=T)
df.merge <- df.merge[, -2]
我想要的是将第一个数据集中第二列的值更改为第二个数据集中第二列的值。第一个数据集中的所有名称都在第二个数据集中,显然我的数据集要大得多
我试着用R来做这件事,但我是个新手。我正在查看intersect命令,但我不确定它是否有效。我不放任何密码,因为我在这里真的迷路了
我还需要第一个数据集中第一列(即名称)的顺序保持不变,但使用第二个数据集中第二列的新值
df1<- data.frame( name1 = letters[6:10], valuecol1=seq(2,10,by=2))
df2 <- data.frame( name2 = letters[1:10], valuecol2=10:1)
df2 [ match(df1$name1, df2$name2) , "valuecol2"] <- df1[ df1$name1 %in% df2$name2 , "valuecol1"]
df2
name2 valuecol2
1 a 10
2 b 9
3 c 8
4 d 7
5 e 6
6 f 2
7 g 4
8 h 6
9 i 8
10 j 10
下面是我如何测试它(编辑)
>df2 df1 df2[匹配(df1$name1,df2$name2),“valuecol2”]df2
名称2值2
1 a 2
2 b 4
3 c 6
4d8
5 e 10
6 f 5
7 g 4
8小时3
9 i 2
10 j 1
是的。。。。又被咬了
> df1<- data.frame( name1 = letters[6:10], valuecol1=seq(2,10,by=2))
> df2 [ match(df1$name1, df2$name2) , "valuecol2"] <- df1[ match(df1$name1, df2$name2) , "valuecol1"]
> df2
name2 valuecol2
1 a 2
2 b 4
3 c 6
4 d 8
5 e 10
6 f NA
7 g NA
8 h NA
9 i NA
10 j NA
>df1 df2[匹配(df1$name1,df2$name2),“valuecol2”]df2
名称2值2
1 a 2
2 b 4
3 c 6
4d8
5 e 10
6 f NA
7克钠
8小时NA
9伊娜
10 j NA
同意@agstudy,简单使用merge就可以了。试着这样做:
df1 <- data.frame(name=c("ab23242", "ab35366", "ab47490", "ab59614"),
X=c(72722, 88283, 99999, 114278.333))
df2 <- data.frame(name=c("ab35366", "ab47490", "ab59614", "ab23242" ),
X=c(12345, 23456, 34567, 456789))
df.merge <- merge(df1, df2, by="name", all.x=T)
df.merge <- df.merge[, -2]
我认为merge将保持第一帧的顺序,但您也可以通过简单地添加一个带有orderdf1$order的列来严格保持顺序,这样如何:
library(data.table)
# generate some random data
dt.1 <- data.table(id = 1:1000, value=rnorm(1000), key="id")
dt.2 <- data.table(id = 2*(500:1), value=as.numeric(1:500), key="id")
# objective is to replace value in df.1 with value from df.2 where id's match.
# data table joins - very efficient
# dt.1 now has 3 columns: id, value, and value.1 from dt.2$value
dt.1 <-dt.2[dt.1,nomatch=NA]
dt.1[is.na(value),]$value=dt.1[is.na(value),]$value.1
dt.1$value.1=NULL # get rid of extra column
库(data.table)
#生成一些随机数据
dt.1df1$@Codoremifa因为两个数据集的顺序不同而无法工作。如果你想这样做,你必须先对第一列进行排序。你可以在这里使用merge
。“我还需要第一个数据集中第一列(即名称)的顺序保持不变,但使用第二个数据集中第二列的新值。”这一行有点混乱。我同意@agstudy关于合并的意见。
name X.y
1 ab23242 456789
2 ab35366 12345
3 ab47490 23456
4 ab59614 34567
library(data.table)
# generate some random data
dt.1 <- data.table(id = 1:1000, value=rnorm(1000), key="id")
dt.2 <- data.table(id = 2*(500:1), value=as.numeric(1:500), key="id")
# objective is to replace value in df.1 with value from df.2 where id's match.
# data table joins - very efficient
# dt.1 now has 3 columns: id, value, and value.1 from dt.2$value
dt.1 <-dt.2[dt.1,nomatch=NA]
dt.1[is.na(value),]$value=dt.1[is.na(value),]$value.1
dt.1$value.1=NULL # get rid of extra column