将整数更改为data.frame中的特定字符串

时间:2015-06-02 16:20:58

标签: r lookup-tables

我有一个包含两列的数据框。第二列仅包含整数。更确切地说,它包含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中很容易,但似乎我脑子里有一块阻挡。

3 个答案:

答案 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是有问题的。