将一个数据框中的值替换为另一个数据框中的值

时间:2014-09-13 01:32:09

标签: r for-loop lapply

我需要将当前按字母顺序排列的单个标识符更改为数字。我创建了一个数据框,其中每个字母标识符与数字

相关联
individuals num.individuals (g4)
1           ZYO              64
2           KAO              24
3           MKU              32
4           SAG              42

我需要用我的主数据框(g3)中的数字64替换ZYO,并且对所有其他代码一样明智。

我的主数据框(g3)看起来像这样

  SAG YOG GOG BES ATR ALI COC CEL DUN EVA END GAR HAR HUX ISH INO JUL
1                   2                                                
2                   2                 EVA                            
3 SAG               2                 EVA                            
4                   2                                                
5 SAG               2                                                
6                   2

现在,我可以编写一个代码来改变它,就像我用ATR做的那样

g3$ATR <- as.character(g3$ATR)
g3[g3$target == "ATR" | g3$ATR == "ATR","ATR"] <- 2

但这是耗时且增加了人为错误的可能性。

我知道有很多方法可以通过NAs大规模地实现这一目标

我想也许我们可以为此做一个for循环,但我不够自己写一个。

我也一直在尝试使用这个功能,我觉得可能会工作,但我不知道如何逻辑地构建这个参数,它发布在这里的问题板上 Fast replacing values in dataframe in R

df <- as.data.frame(lapply(df, function(x){replace(x, x <0,0)})

我试图通过

将数据用于此
df <- as.data.frame(lapply(g4, function(g3){replace(x, x <0,0)})

1 个答案:

答案 0 :(得分:1)

以下是使用data.table包的一种方法:

首先,创建一个类似于您的数据的可重现示例:

require(data.table)
ref <- data.table(individuals=1:4,num.individuals=c("ZYO","KAO","MKU","SAG"),g4=c(64,24,32,42))
g3 <- data.table(SAG=c("","SAG","","SAG"),KAO=c("KAO","KAO","","")) 

这是ref表:

   individuals num.individuals g4
1:           1             ZYO 64
2:           2             KAO 24
3:           3             MKU 32
4:           4             SAG 42

这是你的g3表:

   SAG KAO
1:     KAO
2: SAG KAO
3:        
4: SAG    

现在我们找到并替换:

g3[ , lapply(.SD,function(x) ref$g4[chmatch(x,ref$num.individuals)])]

最终结果:

   SAG KAO
1:  NA  24
2:  42  24
3:  NA  NA
4:  42  NA

如果您需要更快的速度,fastmatch包可能有助于他们的fmatch功能:

require(fastmatch)
g3[ , lapply(.SD,function(x) ref$g4[fmatch(x,ref$num.individuals)])]

   SAG KAO
1:  NA  24
2:  42  24
3:  NA  NA
4:  42  NA