2016-01-15 6 views
3

Я пытаюсь найти прямой способ для векторизации/обобщения подмножества data.frame. Давайте предположим, что у меня есть data.frame:Применение векторизованного подмножества в нескольких столбцах в R

df <- data.frame(A = 1:5, B = 10 * 1:5, C = 100 * 1:5) 

Каждый столбец имеет свое собственное состояние и цель подмножество ФР так, что только те строки, остаются там, где условие выполняется, по крайней мере один столбец. Теперь я хочу, чтобы найти векторизованную механизм подмножество, обобщающий

df <- subset(df, df[,1]<2 | df[,2]< 30 | df[,3]<100) 

, так что я мог бы сформулировать нечто вроде этого

crit <- c(2,30,100) 
df <- subset(df, df$header < crit[1:3]) 

и вниз по дороге, я хочу, чтобы добраться.

df <- subset(df, df$header < crit[1:n]) 

Я знаю, что обходной путь цикла многостадийный, но должен быть другой путь. Я благодарен за любую помощь.

+3

Сторона примечания: 'df <- data.frame (A = 1: 5, B = 10 * 1: 5, C = 100 * 1: 5)' проще, чем использовать 5 строк для создания вашего фрейма данных ;-) –

+3

'df [rowSums (mapply (\' <\ ', df, crit))> 0,]' возможно? – rawr

+0

Большое вам спасибо, я был так далеко от кролика кролика, я забыл о карте! –

ответ

4

Дано:

x <- c(1:5) 
y <- c(10,20,30,40,50) 
z <- c(100,200,300,400,500) 

# df is a base function 
mydf <- data.frame(A = x, B = y, C = z) 

crit <- c(2,30,100) 

Тогда это позволит вам увидеть, какие значения в столбце меньше, чем значение крита:

> sweep(mydf, 2, crit, "<") 
     A  B  C 
[1,] TRUE TRUE FALSE 
[2,] FALSE TRUE FALSE 
[3,] FALSE FALSE FALSE 
[4,] FALSE FALSE FALSE 
[5,] FALSE FALSE FALSE 

И это даст вам строки, которые отвечают любым критериям:

> subset(mydf, rowSums(sweep(mydf, 2, crit, "<")) > 0) 

    A B C 
1 1 10 100 
2 2 20 200 
+0

работает тоже, решение mapply от rawr немного быстрее, по крайней мере на моей машине –

1

Это также должно работать

> df[apply(df, 1, function(x){any(x < crit)}), ] 
    A B C 
1 1 10 100 
2 2 20 200 

 Смежные вопросы

  • Нет связанных вопросов^_^