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

当然,您会收到一些警告,因为“-”不能转换为数字

我认为有两种可能性:

  • 不太可能的情况是,您在R中构建了data.frame。然后,只需更改代码以首先创建整数向量,或者将
    -
    替换为
    NA
    ,这样
    as.numeric
    转换就不会出现问题

  • 更有可能的情况是,您的data.frame来自R之外,您可能使用
    read.table
    read.csv
    函数之一读取它。然后只需将
    na.strings=“-”
    添加到您的通话中,R就会知道这些
    -
    将被理解为
    na
    。此外,如果这些列中没有其他奇怪的项,则在这些函数中调用的
    type.convert
    函数将自动检测这些列中是否充满整数,并将其存储为整数


  • 我认为有两种可能性:

  • 不太可能的情况是,您在R中构建了data.frame。然后,只需更改代码以首先创建整数向量,或者将
    -
    替换为
    NA
    ,这样
    as.numeric
    转换就不会出现问题

  • 更有可能的情况是,您的data.frame来自R之外,您可能使用
    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真的很有帮助-我不知道那段代码。那么,我会给你一个答案。。。如果你愿意的话,请接受。