【问题标题】:Replace value in column with predefined value from another column in R用 R 中另一列的预定义值替换列中的值
【发布时间】:2014-12-05 06:24:02
【问题描述】:

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

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 列,如果col2 列中的某个字符串为真(在本例中为x),则将其替换为值1。

我可能会总结出其他条件字符串。

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"

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

【问题讨论】:

  • 你的NA 只是"NA"

标签: r string replace


【解决方案1】:

在您的情况下,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 的解决方案

【讨论】:

    【解决方案2】:

    您可以使用&amp; 组合条件。

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

    【讨论】:

      猜你喜欢
      • 2015-11-21
      • 2016-03-08
      • 2019-06-01
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多