Использование цикла для выбора столбцов с использованием разных векторов

Скажем, у меня есть 3 вектора (строки из 10):

X <- c(1,1,0,1,0, 1,1, 0, NA,NA)
H <- c(0,0,1,0,NA,1,NA,1, 1, 1 )
I <- c(0,0,0,0,0, 1,NA,NA,NA,1 )

Data.frame Y содержит 10 столбцов и 6 строк:

1 2 3 4 5 6 7 8 9 10  
0 1 0 0 1 1 1 0 1  0      
1 1 1 0 1 0 1 0 0  0      
0 0 0 0 1 0 0 1 0  1      
1 0 1 1 0 1 1 1 0  0      
0 0 0 0 0 0 1 0 0  0      
1 1 0 1 0 0 0 0 1  1

Я хотел бы использовать вектор X, H en I для выбора столбцов в data.frame Y, используя «1» и «0» в векторе в качестве критерия выбора. Таким образом, результаты для вектора X с использованием «1» в качестве критерия выбора должны быть:

X <- c(1,1,0,1,0, 1,1, 0, NA,NA)
1 2   4    6 7
0 1   0    1 1
1 1   0    0 1
0 0   0    0 0
1 0   1    1 1
0 0   0    0 1
1 1   1    0 0

Для вектора H с использованием «1» в качестве критерия выбора:

H <- c(0,0,1,0,NA,1,NA,1, 1, 1 )
3      6    8  9  10
0      1    0  1  0
1      0    0  0  0
0      0    1  0  1
1      1    1  0  0
0      0    0  0  0
0      0    0  1  1

Для вектора I, использующего «1» в качестве критерия выбора:

I <- c(0,0,0,0,0, 1,NA,NA,NA,1 )
6          10
1          0
0          0
0          1
1          0
0          0
0          1

Для удобства и скорости я хотел бы использовать цикл. Это может быть что-то вроде этого:

all.ones <- lapply[,function(x) x %in% 1]

В результате (all.ones) результат для каждого вектора должен оставаться отдельным. Например:

X 1,2,4,6,7    
H 3,6,8,9,10
I 6,10

person EJHendriks    schedule 10.04.2014    source источник


Ответы (3)


Стандартный способ сделать это — использовать оператор %in%:

Y[, X %in% 1]

Чтобы сделать это для нескольких векторов (при условии, что вам нужна операция И):

mylist = list(X, H, I, D, E, K)
Y[, Reduce(`&`, lapply(mylist, function(x) x %in% 1))]
person eddi    schedule 10.04.2014
comment
Первая великолепна! Второй результат дает ответ из 0 столбцов и 300 000 строк. - person EJHendriks; 10.04.2014
comment
@EJHendriks, если вы можете привести (простой) воспроизводимый пример, было бы довольно легко определить проблему. - person eddi; 10.04.2014
comment
Я попытался более подробно описать вопрос выше. - person EJHendriks; 11.04.2014
comment
@EJHendriks выглядит так, будто вам просто нужно «или» вместо «и», поэтому просто замените & на | и тебе должно быть хорошо идти - person eddi; 11.04.2014
comment
К сожалению, это приводит только к одной итоговой строке скомпилированных данных. Цель состоит в том, чтобы получить три отдельные группы столбцов, т.е. X 1,2,4,6,7 H 3,6,8,9,10 I 6,10 - person EJHendriks; 11.04.2014
comment
@EJHendriks извините, мне непонятно, чего вы хотите - возможно, это lapply(mylist, function(x) Y[, x %in% 1])? - person eddi; 11.04.2014
comment
Вторая попытка. Надеюсь, я изложил свой вопрос немного яснее :). - person EJHendriks; 13.04.2014
comment
@EJHendriks Я предлагаю создать пример ввода/вывода, как будто ни одно из приведенных выше предложений не работает для вас, я до сих пор, к сожалению, не знаю, чего вы хотите - person eddi; 14.04.2014
comment
Потребовалось время, чтобы придумать следующую попытку :). - person EJHendriks; 23.04.2014

Проблема в NA, используйте which, чтобы обойти это. Рассмотрим следующее:

x <- c(1,0,1,NA)
x[x==1]
[1]  1  1 NA
x[which(x==1)]
[1] 1 1
person James    schedule 10.04.2014

Как насчет этого?

idx <- which(X==1)
Y[,idx]

РЕДАКТИРОВАТЬ: для шести векторов выполните

idx <- which(X==1 & H==1 & I==1 & D==1 & E==1 & K==1)
Y[,idx]

Замените & на |, если вам нужны все столбцы Y, где хотя бы в одном из списков есть 1.

person Karsten W.    schedule 10.04.2014
comment
Превосходно! Большое спасибо! - person EJHendriks; 10.04.2014
comment
Это работает идеально! Сейчас я пытаюсь сделать это для шести разных векторов в кадре данных Y, используя цикл. mylist ‹- list(X,H,I,D,E,K) for(i in mylist){i ‹- which(i==1 & !is.na(i))} Однако это дает результаты только для последнего вектора K. Любые советы? - person EJHendriks; 10.04.2014
comment
Каким-то образом это приводит к 0 столбцам с 300 000 строк, поэтому информация кажется потерянной при расчете? - person EJHendriks; 11.04.2014