我有一个数据框,其数据组织如下:
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"
有没有人知道如何解决这个问题?
答案 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
如果有前导/滞后空格,您可以删除感兴趣的列(假设为group
和col2
)
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