用NA替换实际数据点

时间:2019-02-04 19:02:57

标签: r if-statement na tidyr

我正在看一个大型的野生动物测量数据集,这是我读到R中的一个excel文件。由于测量了成千上万的个体动物,因此数据中存在许多错误,这些错误是没有逻辑意义的。例如,通常重22-32克的动物体重记录为610克。除了不合逻辑之外,这还使我制作的每张图的比例都降低了。

我尝试了许多方法来用NA代替这些数据点。我使用以下代码从权重的原始列中创建了一个新列:

index <- which(row.names(df1) %in% row.names(df2))

df1_common_rows <- df1[index,]

对于每个错误数据点,我都会想到的原始excel文件中的每个排列(“ 610.0”,“ 610.0”,“ 610”,“ 610”,“ 610”)都重复此操作。这行不通:当我在新的“净重”列上运行unique()时,我尝试删除的所有数据点都返回了。

我安装了naniar,然后以这种方式再次尝试了代码:

original.dataset[, weight_clean:= ifelse(Weight=="610.0", NA, Weight)]

完整代码具有所有错误数据点的所有排列。

这也不起作用。在运行此代码后,在“净重”列上运行unique()时,所有错误的数据点仍会出现。

我觉得答案就在我的鼻子底下,但是我的研究和编码尝试没有帮助。我想念什么?

1 个答案:

答案 0 :(得分:1)

按照@Frank的建议,您应该将权重转换为数字。
pro_tip:表明计量单位将长期支付股息

original.dataset[, weight_grams := as.numeric(Weight)]

在使用它的同时,您可能还希望清理字符串列

library(stringr)

## eg, for a column named "animal":
original.dataset[, animal := animal %>% 
                              to.lower() %>% 
                              str_trim() %>% 
                              str_replace_all("\\s", "_")
                ]

那么您可以拥有一系列逻辑规则

## EG:
original.dataset[animal == "etruscan_shrew" & (weight_grams <     1 | weight_grams >       3), weight_grams := NA]
original.dataset[animal == "elephant"       & (weight_grams < 90000 | weight_grams > 6500000), weight_grams := NA]
# etc ... 

当您开始输入所有规则时,您可能会发现,拥有一个单独的csv(excel文件)可以通过三个简单的列轻松地导入和引用,这将更有意义:

animal           | min_weight_grams | max_weight_grams  |
"etruscan_shrew" |                1 |                3  |
"elephant"       |            90000 |          6500000  |