在R中,根据另一个包含NA值的因子,替换数据框中的值

4
我有一个数据框,其中包含(除其他内容外)一个浓度的数字列和一个状态标志的因子列。该状态标志包含NA值。
以下是一个示例:
df<-structure(list(conc = c(101.769, 1.734, 62.944, 92.697, 25.091, 27.377, 24.343, 55.084, 0.335, 23.280), status = structure(c(NA, NA, NA, NA, NA, NA, 2L, NA, 1L, NA), .Label = c("<LLOQ", "NR"), class = "factor")), .Names = c("conc", "status"), row.names = c(NA, -10L), class = "data.frame")

我希望能够根据标志列的某些值,用字符串替换浓度列,或者用特定数量的有效数字格式化的浓度值来替换浓度列。
当我尝试这样做时:
ifelse(df$status=="NR","NR",df$conc)

状态标志中的NA既不触发true条件也不触发false条件(并返回NA)-正如文档所建议的那样。我可以在每一行上循环并使用IF然后对每个进行操作,但这似乎效率低下。

我有什么遗漏吗?我也尝试过as.character(df $ status),但不起作用。我的魔法可能正在减退....

3个回答

5

请使用%in%代替==

ifelse(df$status %in% "NR","NR", df$conc)

两种方法的并排比较:

data.frame(df, ph = ifelse(df$status=="NR","NR",df$conc), mp = ifelse(df$status %in% "NR","NR",df$conc))

查看?match获取更多信息 - 我不确定我能很好地解释它。


3

您必须明确测试 NA,以便您可以使用以下内容:

ifelse(df$status=="NR" | is.na(df$status),"NR",df$conc) # gives you NR for NA

或者

ifelse(df$status=="NR" & !is.na(df$status),"NR",df$conc) # gives you df$conc for NA

2
如何检测缺失值:
ifelse(is.na(df$status), df$conc, as.character(df$status))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接