条件if在基于另一个的数据帧上

时间:2013-10-18 10:45:56

标签: r

我有一个像这样的数据框

ID      VAR
a       3
b       2
c       6
b       8
z       1
c       5
b       7

和另一个计算出现一个ID的次数

numb    nrec

a       1
b       3
c       2
z       1

我想要做的是更改只有一条记录的所有ID的ID名称,p.e。

ID      VAR
-1      3
b       2
c       6
b       8
-1      1
c       5
b       7

1 个答案:

答案 0 :(得分:1)

这是一个丑陋的解决方案

> ind <- as.character(df2$numb[df2$nrec==1])
> df1$ID <- as.character(df1$ID)
> df1$ID[as.character(df1$ID) %in% ind] <- "-1"
> df1
  ID VAR
1 -1   3
2  b   2
3  c   6
4  b   8
5 -1   1
6  c   5
7  b   7

如果您希望ID再次成为因子,那么df1$ID <- as.factor(df1$ID)

更好的方法是使用plyr包中的revalue

library(plyr)
df1$ID <- with(df1, revalue(ID, c("a"="-1", "z"=-1)))

编辑:使用基本功能的更简洁方法

ind <- as.character(df2$numb[df2$nrec==1])
levels(df1$ID)[levels(df1$ID)==ind] <- "-1"

您甚至可以仅使用df1直接进行,无需使用df2。使用table和一些索引......

levels(df1$ID)[levels(df1$ID)==with(df1, levels(ID)[table(ID)==1])] <- "-1"