我正在尝试确定NA是通过强制添加到哪些列中的。特别是如果我有一个非常大的数据表。以一个较小的表格为例,将表格从字符转换为数字(从excel表格中读取)。
clean_tab数据:
A tibble: 3 x 3
a b c
<dbl> <chr> <chr>
1 0.5 4-2 5
2 0.1 0.29999999999999999 3-1
3 0.3 0.40000000000000002 4 应用于数据的代码:
b <- c(1,2,3)
clean_tab[, b] <- sapply(clean_tab[, b], as.numeric)
View(clean_tab)产生的警告消息和输出:
Warning messages:
1: In lapply(X = X, FUN = FUN, ...) : NAs introduced by coercion
2: In lapply(X = X, FUN = FUN, ...) : NAs introduced by coercion
> clean_tab
# A tibble: 3 x 3
a b c
<dbl> <dbl> <dbl>
1 0.5 NA 5
2 0.1 0.3 NA
3 0.3 0.4 4在这种情况下,因为它是一个较小的表,我可以清楚地看到添加NA的位置。如果表更大,我如何识别添加了安娜的列(更具体地说是行和列)?
谢谢你的帮助。
发布于 2018-10-08 11:42:17
我们可以使用arr.ind为TRUE的which来返回NA元素的行/列索引
which(is.na(clean_tab), arr.ind = TRUE)
# row col
#1 1 2
#2 2 3由于输入数据是一个tibble,因此我们可以使用tidyverse方法进行转换
library(tidyverse)
library(magrittr)
clean_tab %<>%
mutate_at(b, as.numeric)数据
clean_tab <- structure(list(a = c(0.5, 0.1, 0.3), b = c("4-2",
"0.29999999999999999", "0.40000000000000002"),
c = c("5", "3-1", "4")), row.names = c("1",
"2", "3"), class = c("tbl_df", "tbl", "data.frame"))发布于 2018-10-08 11:52:39
可以采用的一种方法是尝试将每一列转换为数字,然后断言该尝试是否产生了任何NA值:
df <- data.frame(a=c(0.5, 0.1, 0.3),
b=c("4-2", "0.29999999999999999", "0.40000000000000002"),
c=c("5", "3-1", "4"), stringsAsFactors=FALSE)
names(df)[sapply(df, function(x) { sum(is.na(as.numeric(x))) > 0 })]
[1] "b" "c"https://stackoverflow.com/questions/52695093
复制相似问题