更改另一列中值的列值

时间:2013-12-03 19:28:43

标签: r multiple-columns

我有两个看起来像这样的数据集:

http://i.stack.imgur.com/ROUiF.png

我想要的是将第一个数据集中第二列的值更改为第二个数据集中第二列的值。第一个数据集中的所有名称都在第二个数据集中,显然我的数据集远大于此。

我试图用R来做到这一点,但我很擅长。我正在看交叉命令,但我不确定它是否会起作用。我没有放任何代码,因为我真的迷失了。

我还需要第一个数据集中第一列(名称)的顺序保持不变,但使用第二个数据集的第二列中的新值。

3 个答案:

答案 0 :(得分:1)

同意@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]

<强>输出:

     name    X.y
1 ab23242 456789
2 ab35366  12345
3 ab47490  23456
4 ab59614  34567

我认为合并将保持第一帧的顺序,但您也可以通过简单地添加订单df1$order <- 1:nrow(df1)的列以及稍后基于该列的排序来严格保持订单。

答案 1 :(得分:0)

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

这是我认为可行的方法,但使用match索引进行替换有时会让我感到困惑:

 df2 [match(df1$name1, df2$name2) , "valuecol2"] <- 
                          df1[ match(df1$name1, df2$name2) , "valuecol1"]

以下是我测试它的方法(编辑过)。

> df2 <- data.frame( name2 = letters[1:10], valuecol2=10:1)
> df1<- data.frame( name1 = letters[1:5], 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         5
7      g         4
8      h         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

答案 2 :(得分:0)

这个怎么样:

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

注意:这会dt.1id排序,这应该没问题,因为它已经按照这种方式排序了。

将来,请包含可导入R的数据。图片无效!