我有一个包含两列的数据框。第二列仅包含整数。更确切地说,它包含0,1,2,3和一些NA' s。像这样:
id1 0
id2 1
id3 0
id4 2
id5 3
id6 1
id7 2
id8 NA
我正在搜索的是一个命令,它将0变为ZZT,将1变为ZZU,依此类推。 NA应该保持NA状态。这怎么可行?
我尝试将for循环与一些if语句结合使用,但这并不起作用。我知道这种改变的想法在R中很容易,但似乎我脑子里有一块阻挡。
答案 0 :(得分:13)
这样做:
# Setup an example data frame
df <- data.frame(id=c("id1","id2","id3","id4","id5","id6","id7","id8"),
val=c(0,1,0,2,3,1,2,NA))
# Now setup the translation vector - essentially a lookup table
trans <- c("ZZT","ZZU","ZZV","ZZW",NA)
names(trans) <- c(0,1,2,3,NA)
# Now translate the values into a new column and print it out
df$nval <- trans[ as.character(df$val) ]
df$nval
# [1] "ZZT" "ZZU" "ZZT" "ZZV" "ZZW" "ZZU" "ZZV" NA
它使用命名向量作为查找表。括号实际上是一个子集运算符,当您使用字符向量访问它时,它使用向量名称进行子集化。
阅读Hadley Wickham的伟大&#34;高级R&#34;关于子集化的章节,如果你没有得到这个。 http://adv-r.had.co.nz/Subsetting.html
答案 1 :(得分:6)
使用match
在替换值向量中创建索引向量是&#34;规范&#34; R方法(使用Mike Wise的例子)
c("ZZT","ZZU","ZZV","ZZW",NA)[ match( df1$val, c(0,1,2,3,NA))]
[1] "ZZT" "ZZU" "ZZT" "ZZV" "ZZW" "ZZU" "ZZV" NA
如果你想要更换它们,那么#34;就位#34; (通常是危险的选择)那么这可能会起作用:
df$val <- c("ZZT","ZZU","ZZV","ZZW",NA)[ match( df$val, c(0,1,2,3,NA))]
答案 2 :(得分:6)
您可以使用plyr包中的mapvalues
函数映射值。使用Mike Wise的答案中的示例数据:
library(plyr)
df$val2 <- mapvalues(df$val,
from = c(0,1,2,3,NA),
to = c("ZZT", "ZZU", "ZZV", "ZZW", NA))
如果您已经加载了dplyr包(plyr的后继者),请使用plyr::mapvalues()
调用此函数,因为在dplyr之上加载plyr是有问题的。