首页 文章

过滤数据帧的每一列,将NA设置为不匹配的值

提问于
浏览
1

我有一张表如下:

[,1]  [,2] [,3]    [,4]   [,5] 
[1,]  a     A   0.06    0.31   -1.5
[2,]  b     B  -0.75    0.2    0.02
[3,]  c     C   1.58   -0.02    1.5

我想在第3列到第5列上设置一个截止值来找到它们的绝对值大于1的单元格 .

我还想用绝对值和与“NA”匹配的单元格填充匹配值 .

为此,我使用dplyr包中的过滤器功能,但我无法获得所需的结果 . 有没有人知道我该怎么做?

这是输出必须看起来的东西:

[,1]  [,2] [,3]    [,4]   [,5] 
[1,]  a     A   NA       NA    1.5
[2,]  b     B   NA       NA     NA
[3,]  c     C   1.58     NA    1.5

谢谢!

4 回答

  • 1

    可以尝试使用 dplyr::mutate_at 作为:

    library(dplyr)
    
    df %>% mutate_at(vars(3:5), funs(ifelse(abs(.) > 1, abs(.), NA_integer_)))
    

    或者如果数据有 factor 类型列,请尝试:

    df %>% mutate_at(vars(3:5), funs(ifelse(abs(as.numeric(as.character(.))) > 1, 
                                         abs(as.numeric(as.character(.))), NA_integer_)))
    
    #   V1 V2   V3 V4  V5
    # 1  a  A   NA NA 1.5
    # 2  b  B   NA NA  NA
    # 3  c  C 1.58 NA 1.5
    

    Data:

    df <- read.table(text="
    a     A   0.06    0.31   -1.5
    b     B  -0.75    0.2    0.02
    c     C   1.58   -0.02    1.5",
    stringsAsFactors = FALSE)
    
  • 1

    这是一个 base R 选项

    df[3:5] <- lapply(df[3:5], function(x) replace(x, abs(x) < 1, NA))
    df
    #  V1 V2   V3 V4   V5
    #1  a  A   NA NA -1.5
    #2  b  B   NA NA   NA
    #3  c  C 1.58 NA  1.5
    

    数据

    df <- structure(list(V1 = c("a", "b", "c"), V2 = c("A", "B", "C"), 
    V3 = c(0.06, -0.75, 1.58), V4 = c(0.31, 0.2, -0.02), V5 = c(-1.5, 
    0.02, 1.5)), .Names = c("V1", "V2", "V3", "V4", "V5"), 
    class = "data.frame", row.names = c(NA, -3L))
    
  • 2

    你只能使用这样的R基函数来做到这一点:

    > dat <- read.table(text="a     A   0.06    0.31   -1.5
     b     B  -0.75    0.2    0.02
     c     C   1.58   -0.02    1.5", header=FALSE)
    > dat[,3:5][abs(dat[,3:5])<=1]<-NA
    > dat[,3:5] <- abs(dat[,3:5])
    > dat
      V1 V2   V3 V4  V5
    1  a  A   NA NA 1.5
    2  b  B   NA NA  NA
    3  c  C 1.58 NA 1.5
    
  • 0
    dat <- read.table(text="
            a     A   0.06    0.31   -1.5
            b     B  -0.75    0.2    0.02
            c     C   1.58   -0.02    1.5", header=FALSE)
    
     dat[3:5] = abs(dat[3:5])
    
     is.na(dat[3:5]) = dat[3:5]<1
    
     dat
      V1 V2   V3 V4  V5
    1  a  A   NA NA 1.5
    2  b  B   NA NA  NA
    3  c  C 1.58 NA 1.5
    

相关问题