фильтрация каждого столбца фрейма данных положенного NA для несогласованных значений - PullRequest
0 голосов
/ 05 июля 2018

У меня есть следующая таблица:

     [,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 голосов
/ 06 июля 2018

Вот вариант 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))
0 голосов
/ 06 июля 2018

Можно попробовать использовать 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)
0 голосов
/ 06 июля 2018
 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
0 голосов
/ 05 июля 2018

Вы можете сделать это, используя только базовые функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...