【发布时间】:2021-03-22 12:54:21
【问题描述】:
对编码还是很陌生,我一直在遇到子集问题。在这种情况下,我的目标是从我的数据框中删除 NA 值。
col1 <- c("text", NA, "text", NA)
col2 <- c(NA, "text", "text", NA)
col3 <- c("text", NA, "text", NA)
col4 <- c(17, 22, NA, NA)
col5 <- c(3, NA, 3, 17)
df <- data.frame(col1, col2, col3, col4, col5)
当我只使用data[is.na(data)] <- 0 或data[is.na(data)] <- "" 时,我得到一个错误,我理解这是因为我将错误类型的值分配给错误的列类型。没有'numeric'空字符串,也没有整数值为0的字符串。
我想要的是将数字列中的所有 NA 转换为 0,将字符列中的所有 NA 转换为“”。我想出了如何从逻辑上解决问题的两个部分:
is.na(df)
> col1 col2 col3 col4 col5
> [1,] FALSE TRUE FALSE FALSE FALSE
> [2,] TRUE FALSE TRUE FALSE FALSE
> [3,] FALSE FALSE FALSE FALSE FALSE
> [4,] TRUE TRUE TRUE FALSE FALSE
unlist(lapply(df, is.numeric), use.names=FALSE)
> [1] FALSE FALSE FALSE TRUE TRUE
现在有了这个,当然,我可以简单地编写一个 for 循环来遍历每个循环,确定一列是否为数字,然后在该列中相应地替换 NA。同样,如果我理解正确,我还可以扩展 unlist 产生的向量并将其转换为 20 个元素的向量和子集 df[ x == y ] <- 0 and df[ x != y] <- "" 或者我可以创建几个新的数据帧,相应地更改 NA,然后重新组合。
但是必须有一种更简单的方法来做到这一点。我猜这是我将继续遇到的问题,所以我希望而不是仅仅得到一个解决方案,我实际上可以理解如何“正确”地做到这一点(在 R 中可能会给我 5 个人的 8 条建议)。
【问题讨论】:
标签: r