如何在多列中将特定字符串更改为NA并将列更改为数字

时间:2017-08-28 18:06:58

标签: r

我的数据中有些列混合了library.sort(function(a, b){ var tA = a.title.toUpperCase(); var tB = b.title.toUpperCase(); if (tA < tB) { return -1; } if (tA > tB) { return 1; } return 0; }) character数据。例如:

numeric

所有传感器值应为Sensor Sensor2 Sensor3 Fail 5 Fail Fail 5 Fail Fail 5 Fail Fail 5 Fail 5 5 Fail 6 5 Fail 8 5 Fail ,但R会自动将Sensor1和Sensor3作为numeric值。我想将“失败”替换为character或某些数值,或将整个列类型更改为数字类型,以便“失败”将自动更改为NA

我的问题是我的数据集非常大(传感器数据每秒生成一次,有200多个变量)。我想识别包含“失败”的所有列,并将这些列更改为NA类型。

这就是我尝试过的:我写了一个函数

numeric

此功能有效,但唯一的问题是整个数据框已更改为function(mydata, value1, value2){ mydata <- data.frame(lapply(mydata, function(x){ gsub(value1, value2 ,x) })) } 类型。我有factornumeric的混合,我希望保持数据类型正确。所以我试过

character

这会将我的所有列都更改为 function(mydata, value1, value2){ mydata <- data.frame(lapply(mydata, function(x){ is.numeric(gsub(value1, value2 ,x)) })) } ,因此我错过了所有numeric列信息。

如何仅识别“失败”列并仅对这些列进行更改并使用更改更新我的数据框?感谢。

1 个答案:

答案 0 :(得分:0)

我使用

创建示例数据
data <- read.table(text = "Sensor  Sensor2   Sensor3
                   Fail    5         Fail
                   Fail    5         Fail
                   Fail    5         Fail
                   Fail    5         Fail
                    5      5         Fail
                    6      5         Fail
                    8      5         Fail",
                   header = TRUE, stringsAsFactors = FALSE)
data$char <- letters[1:nrow(data)]

最后一行引入了一个不应转换为数字的附加列。

请注意,我使用stringsAsFactors = FALSE来确保没有列成为因素。在进行转换之前,您还应该检查数据中是否包含任何因子变量

第一步是识别某处包含"Fail"的列:

fail_cols <- sapply(data, function(x) any(grepl("Fail", x)))

然后,我定义了一个用"Fail"替换NA并转换为数字的函数:

to_num <- function(x) {
  as.numeric(gsub("Fail", NA, x))
}

请注意,我使用的是as.numeric(),而不是is.numeric()。前者转换为数字,后者检查变量数字。

此功能现在仅应用于包含"Fail"的数据框的那些列:

data[fail_cols] <- lapply(data[fail_cols], to_num)
data
##   Sensor Sensor2 Sensor3 char
## 1     NA       5      NA    a
## 2     NA       5      NA    b
## 3     NA       5      NA    c
## 4     NA       5      NA    d
## 5      5       5      NA    e
## 6      6       5      NA    f
## 7      8       5      NA    g

您已在问题中指出,仅使用as.numeric()代替to_num()会产生相同的结果。然而,它会发出警告信息的缺点。为了避免这些,定义to_num()可能仍然有帮助。