将列中的值替换为R中另一列的预定义值

时间:2014-12-05 06:24:03

标签: r string replace

我有一个数据框,其数据组织如下:

data <- structure(list(group = c("a", "a", "b", "b"), yr1 = c(1927L, 1953L, 1957L, 1961L), yr2 = c(1934L, 1955L, 1958L, 1965L), val = c("1", "1",  "1", "NA"), col2 = c("x", " -x", " ", " x ")), .Names = c("group", "yr1", "yr2", "val", "col2"), class = "data.frame", row.names = c(NA, -4L))

 group  yr1  yr2 val col2
1     a 1927 1934   1   x   
2     a 1953 1955   1  -x
3     b 1957 1958   1     
4     b 1961 1965  NA   x 

我想要做的是检查列val,如果有NA,则将值替换为值{1,如果列col2中的某个字符串为真(在本例中为x)。

可能还有其他条件可能会让我感到沮丧。

values <- c("x", "test", "nts", "kfc") 

我的目标样本数据的结果如下:

      group  yr1  yr2 val col2
    1     a 1927 1934   1   x   
    2     a 1953 1955   1  -x
    3     b 1957 1958   1     
    4     b 1961 1965   1   x

我试图用这样的子集来做但却失败了。

data[data$col2 == "x", ][, "val"] <- "1"

有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

在您的情况下,NA是一个字符'NA'此外,col2似乎还有领先/滞后的空格。

 data$col2
 #[1] "x"   " -x" " "   " x "

所以,

 data$col2=='x'
 #[1]  TRUE FALSE FALSE FALSE

因为NA是字符串

  is.na(data$val)
 #[1] FALSE FALSE FALSE FALSE

由于上述问题,我会使用

 data[with(data, grepl('x', col2) & val=='NA'),'val'] <- 1

修改

如果有前导/滞后空格,您可以删除感兴趣的列(假设为groupcol2

 library(stringr)
 data[c('group', 'col2')] <- lapply(data[c('group', 'col2')], str_trim)

或者

 data[c('group', 'col2')] <- lapply(data[c('group', 'col2')],
                              function(x) gsub('^ +| +$', '', x))

如果您将'NA'更改为NA

  data$val[data$val=='NA'] <- NA

那么你也可以使用@Neal Fultz的解决方案

答案 1 :(得分:1)

您可以使用&来合并条件。

data[data$col2 == "x" & is.na(data$val), "val"] <- 1