Подмножество фрейма данных в R, используя условие на несколько определенных столбцов - PullRequest
0 голосов
/ 02 мая 2018

У меня есть фрейм данных в R

id   name  class   x101   x202   x303

76978 phil 2 0.407034783 0.001 0.192229687
59911 jose 2 0.327173661 0.004 0.227843273
46537 matt 3 0.590337464 0.005 0.057271545
77345 benn 4 0.293847569 0.002 0.170405643
53180 crai 2 0.844581456 0.003 0.253665748
21063 lour 4 0.080756674 0.002 0.902143356
35456 moni 4 0.445965164 0.004 0.531952568

Мне нужно удалить столбцы, которые начинаются с «x» (x101, x202 и x303) и среднее значение меньше 0,1. Это удалит колонку X202. В конце концов мой вывод должен быть таким, как показано ниже:

id   name  class   x101   x303

76978 phil 2 0.407034783 0.192229687
59911 jose 2 0.327173661 0.227843273
46537 matt 3 0.590337464 0.057271545
77345 benn 4 0.293847569 0.170405643
53180 crai 2 0.844581456 0.253665748
21063 lour 4 0.080756674 0.902143356
35456 moni 4 0.445965164 0.531952568

Как я могу сделать это в R?

Ответы [ 4 ]

0 голосов
/ 02 мая 2018

Вы могли бы также сделать:

keep <- !colnames(df) %in% names(which(sapply(df[startsWith(colnames(df), 'x')], mean) < 0.1))
(df <- df[keep])

Уступая

     id name class       x101       x303
1 76978 phil     2 0.40703478 0.19222969
2 59911 jose     2 0.32717366 0.22784327
3 46537 matt     3 0.59033746 0.05727155
4 77345 benn     4 0.29384757 0.17040564
5 53180 crai     2 0.84458146 0.25366575
6 21063 lour     4 0.08075667 0.90214336
7 35456 moni     4 0.44596516 0.53195257


Это многошаговый подход:
  1. Получить столбцы, начинающиеся с x через startsWith(colnames(df), 'x')
  2. Подставьте в них данные и вычислите среднее значение для каждого из них, используя sapply: sapply(df[startsWith(colnames(df), 'x')], mean)
  3. Проверьте среднее значение с помощью which и получите имена: names(which(sapply(df[startsWith(colnames(df), 'x')], mean) < 0.1))
  4. Наконец, это столбцы, которые нам не нужны, поэтому !colnames(df) %in% ...
0 голосов
/ 02 мая 2018

В базе R вы можете сделать следующее.

inx <- which(sapply(dat, inherits, "numeric"))
inx <- names(dat[inx])[grepl("x", names(dat[inx])) & colMeans(dat[inx]) < 0.1]
result <- dat[-which(names(dat) %in% inx)]
result 
#     id name class       x101       x303
#1 76978 phil     2 0.40703478 0.19222969
#2 59911 jose     2 0.32717366 0.22784327
#3 46537 matt     3 0.59033746 0.05727155
#4 77345 benn     4 0.29384757 0.17040564
#5 53180 crai     2 0.84458146 0.25366575
#6 21063 lour     4 0.08075667 0.90214336
#7 35456 moni     4 0.44596516 0.53195257

ДАННЫЕ.

dat <- read.table(text = "
id   name  class   x101   x202   x303
76978 phil 2 0.407034783 0.001 0.192229687
59911 jose 2 0.327173661 0.004 0.227843273
46537 matt 3 0.590337464 0.005 0.057271545
77345 benn 4 0.293847569 0.002 0.170405643
53180 crai 2 0.844581456 0.003 0.253665748
21063 lour 4 0.080756674 0.002 0.902143356
35456 moni 4 0.445965164 0.004 0.531952568
", header = TRUE)
0 голосов
/ 02 мая 2018

Я рекомендую использовать пакет dplyr для достижения этой цели.

    tmp<-read.table(text="id   name  class   x101   x202   x303
76978 phil 2 0.407034783 0.001 0.192229687
59911 jose 2 0.327173661 0.004 0.227843273
46537 matt 3 0.590337464 0.005 0.057271545
77345 benn 4 0.293847569 0.002 0.170405643
53180 crai 2 0.844581456 0.003 0.253665748
21063 lour 4 0.080756674 0.002 0.902143356
35456 moni 4 0.445965164 0.004 0.531952568",header=TRUE)

select_if(tmp,function(x) ((is.numeric(x) & mean(x) > 0.1)|!is.numeric(x)))

Что даст вам желаемый результат.

     id name class       x101       x303
1 76978 phil     2 0.40703478 0.19222969
2 59911 jose     2 0.32717366 0.22784327
3 46537 matt     3 0.59033746 0.05727155
4 77345 benn     4 0.29384757 0.17040564
5 53180 crai     2 0.84458146 0.25366575
6 21063 lour     4 0.08075667 0.90214336
7 35456 moni     4 0.44596516 0.53195257
0 голосов
/ 02 мая 2018

Это потребует корректировки в зависимости от имеющегося у вас фрейма данных (например, если у вас есть больше столбцов), но работает так же, как для вашего примера:

cbind(df[,1:3], df[,4:6][colMeans(df[,4:6]) > 0.1])

Однако, используя grepl, вы можете автоматизировать выбор столбцов, начинающихся с "x", для однострочного базового R :

cbind(df[,!grepl("x", colnames(df))], df[,grepl("x", colnames(df))][colMeans(df[,grepl("x", colnames(df))]) > 0.1])

Анатомия этого сценария: Это говорит о том, что он объединяет столбцы (cbind), которые не начинаются с "x" (df[,!grepl("x", colnames(df))]), и те, которые начинаются с "x", где среднее значение столбца превышает 0,1 (df[,grepl("x", colnames(df))][colMeans(df[,grepl("x", colnames(df))]) > 0.1]).

...