我需要将当前按字母顺序排列的单个标识符更改为数字。我创建了一个数据框,其中每个字母标识符与数字
相关联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)})
答案 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