r中的数值和处理缺失值
使用示例数据帧:r中的数值和处理缺失值,r,R,使用示例数据帧: df <- structure(list( KY27PHY1 = c("4", "5", "5", "4", "-", "4", "2","3", "5", "-", "4", "3", "3", "5", "5"), KY27PHY2 = c("4", "4","4", "4", "-", "5", "2", "3", "5", "-", "5", "3", "3", "5", "5"), KY27PHY3 = c("5", "4", "4", "4", "
df <- structure(list(
KY27PHY1 = c("4", "5", "5", "4", "-", "4", "2","3", "5", "-", "4", "3", "3", "5", "5"),
KY27PHY2 = c("4", "4","4", "4", "-", "5", "2", "3", "5", "-", "5", "3", "3", "5", "5"),
KY27PHY3 = c("5", "4", "4", "4", "-", "5", "1", "4", "5","-", "4", "3", "3", "5", "5")),
.Names = c("KY27PHY1", "KY27PHY2","KY27PHY3"),
row.names = 197:211,
class = "data.frame")
我想这不是一个问题,但我只是想知道如何改进代码,这样我就不会收到这个消息
另外,如何一次完成所有列(由名称指定)
非常感谢。您可以使用
sapply
一次完成所有操作,但最终将得到一个矩阵
,因此您必须将包装为.data.frame
才能进行转换。警告只是告诉您,原始数据中有一些字符无法与数字匹配,因此被替换为NA
。在您的例子中,这些字符是“-”
。要确保不打印警告,请使用suppressWarnings
:
suppressWarnings(as.data.frame(sapply(df,as.numeric)))
KY27PHY1 KY27PHY2 KY27PHY3
1 4 4 5
2 5 4 4
3 5 4 4
4 4 4 4
5 NA NA NA
6 4 5 5
7 2 2 1
8 3 3 4
9 5 5 5
10 NA NA NA
11 4 5 4
12 3 3 3
13 3 3 3
14 5 5 5
15 5 5 5
您可以使用
sapply
一次完成所有操作,但最终将得到一个矩阵
,因此您必须将包装为.data.frame
才能进行转换。警告只是告诉您,原始数据中有一些字符无法与数字匹配,因此被替换为NA
。在您的例子中,这些字符是“-”
。要确保不打印警告,请使用suppressWarnings
:
suppressWarnings(as.data.frame(sapply(df,as.numeric)))
KY27PHY1 KY27PHY2 KY27PHY3
1 4 4 5
2 5 4 4
3 5 4 4
4 4 4 4
5 NA NA NA
6 4 5 5
7 2 2 1
8 3 3 4
9 5 5 5
10 NA NA NA
11 4 5 4
12 3 3 3
13 3 3 3
14 5 5 5
15 5 5 5
data.table
速度非常快,您应该在处理data.frames
后立即使用它。你的问题是:
library(data.table)
dt = as.data.table(df)
dt[,lapply(.SD,as.numeric)]
KY27PHY1 KY27PHY2 KY27PHY3
1: 4 4 5
2: 5 4 4
3: 5 4 4
4: 4 4 4
5: NA NA NA
6: 4 5 5
7: 2 2 1
8: 3 3 4
9: 5 5 5
10: NA NA NA
11: 4 5 4
12: 3 3 3
13: 3 3 3
14: 5 5 5
15: 5 5 5
当然,您会收到一些警告,因为“-”不能转换为数字。table非常快,您应该在处理
数据时立即使用它。frames
。你的问题是:
library(data.table)
dt = as.data.table(df)
dt[,lapply(.SD,as.numeric)]
KY27PHY1 KY27PHY2 KY27PHY3
1: 4 4 5
2: 5 4 4
3: 5 4 4
4: 4 4 4
5: NA NA NA
6: 4 5 5
7: 2 2 1
8: 3 3 4
9: 5 5 5
10: NA NA NA
11: 4 5 4
12: 3 3 3
13: 3 3 3
14: 5 5 5
15: 5 5 5
当然,您会收到一些警告,因为“-”不能转换为数字我认为有两种可能性:
-
替换为NA
,这样as.numeric
转换就不会出现问题read.table
或read.csv
函数之一读取它。然后只需将na.strings=“-”
添加到您的通话中,R就会知道这些-
将被理解为na
。此外,如果这些列中没有其他奇怪的项,则在这些函数中调用的type.convert
函数将自动检测这些列中是否充满整数,并将其存储为整数我认为有两种可能性:
-
替换为NA
,这样as.numeric
转换就不会出现问题read.table
或read.csv
函数之一读取它。然后只需将na.strings=“-”
添加到您的通话中,R就会知道这些-
将被理解为na
。此外,如果这些列中没有其他奇怪的项,则在这些函数中调用的type.convert
函数将自动检测这些列中是否充满整数,并将其存储为整数不久前,我编写了一个小函数来处理将
data.frame
中的某些值设置为NA
并使用type.convert
来转换输出,就像您使用read.table
指定了NA.strings
一样
下面是函数:
makemeNA <- function(mydf, NAStrings, fixed = TRUE) {
dfname <- deparse(substitute(mydf))
if (!isTRUE(fixed)) {
mydf <- data.frame(lapply(mydf, function(x) gsub(NAStrings, "", x)))
NAStrings <- ""
}
mydf <- data.frame(lapply(mydf, function(x) type.convert(
as.character(x), na.strings = NAStrings)))
mydf
}
您可以从str
structure中看到,我们现在有了数字输出
str(makemeNA(df, "-"))
# 'data.frame': 15 obs. of 3 variables:
# $ KY27PHY1: int 4 5 5 4 NA 4 2 3 5 NA ...
# $ KY27PHY2: int 4 4 4 4 NA 5 2 3 5 NA ...
# $ KY27PHY3: int 5 4 4 4 NA 5 1 4 5 NA ...
与na.strings
一样,makemeNA
中的NAStrings
是复数形式。在这里,我们划一个破折号,将值“1”转换为NA
str(makemeNA(df, c("-", 1)))
# 'data.frame': 15 obs. of 3 variables:
# $ KY27PHY1: int 4 5 5 4 NA 4 2 3 5 NA ...
# $ KY27PHY2: int 4 4 4 4 NA 5 2 3 5 NA ...
# $ KY27PHY3: int 5 4 4 4 NA 5 NA 4 5 NA ...
您还可以使用正则表达式将值设置为
NA
,如下所示:
df1 <- data.frame(A = c(1, 2, "-", "not applicable", 5),
B = c("not available", 1, 2, 3, 4),
C = c("-", letters[1:4]))
不久前,我编写了一个小函数来处理将
data.frame
中的某些值设置为NA
并使用type.convert
来转换输出,就像您使用read.table
指定了NA.strings
一样
下面是函数:
makemeNA <- function(mydf, NAStrings, fixed = TRUE) {
dfname <- deparse(substitute(mydf))
if (!isTRUE(fixed)) {
mydf <- data.frame(lapply(mydf, function(x) gsub(NAStrings, "", x)))
NAStrings <- ""
}
mydf <- data.frame(lapply(mydf, function(x) type.convert(
as.character(x), na.strings = NAStrings)))
mydf
}
您可以从str
structure中看到,我们现在有了数字输出
str(makemeNA(df, "-"))
# 'data.frame': 15 obs. of 3 variables:
# $ KY27PHY1: int 4 5 5 4 NA 4 2 3 5 NA ...
# $ KY27PHY2: int 4 4 4 4 NA 5 2 3 5 NA ...
# $ KY27PHY3: int 5 4 4 4 NA 5 1 4 5 NA ...
与na.strings
一样,makemeNA
中的NAStrings
是复数形式。在这里,我们划一个破折号,将值“1”转换为NA
str(makemeNA(df, c("-", 1)))
# 'data.frame': 15 obs. of 3 variables:
# $ KY27PHY1: int 4 5 5 4 NA 4 2 3 5 NA ...
# $ KY27PHY2: int 4 4 4 4 NA 5 2 3 5 NA ...
# $ KY27PHY3: int 5 4 4 4 NA 5 NA 4 5 NA ...
您还可以使用正则表达式将值设置为
NA
,如下所示:
df1 <- data.frame(A = c(1, 2, "-", "not applicable", 5),
B = c("not available", 1, 2, 3, 4),
C = c("-", letters[1:4]))
这真的很有帮助@flodel-我不知道那段代码。好吧,我会回答的。。。如果你愿意接受的话。这对@flodel真的很有帮助-我不知道那段代码。那么,我会给你一个答案。。。如果你愿意的话,请接受。