我的数据中有些列混合了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)
}))
}
类型。我有factor
和numeric
的混合,我希望保持数据类型正确。所以我试过
character
这会将我的所有列都更改为 function(mydata, value1, value2){
mydata <- data.frame(lapply(mydata, function(x){
is.numeric(gsub(value1, value2 ,x))
}))
}
,因此我错过了所有numeric
列信息。
如何仅识别“失败”列并仅对这些列进行更改并使用更改更新我的数据框?感谢。
答案 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()
可能仍然有帮助。