过滤数据帧的每一列,并放入一个不匹配值的put NA

时间:2018-07-05 20:24:25

标签: r dataframe filter dplyr subset

我有一张桌子,如下:

     [,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 个答案:

答案 0 :(得分:2)

一个人可以尝试将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

数据:

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 :(得分:1)

您只能使用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

答案 2 :(得分: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))

答案 3 :(得分: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