2013-11-07 3 views
2

Как выбрать строки из фрейма данных, значение которого превышает 1 в определенном столбце?Выбор строк по определенному значению

Вот как мои данные выглядит следующим образом:

> dput(head(tbl_comp[,-1])) 
structure(list(Meve_mean = c(7774.44229552491, 43374.1166119026, 
585562.72426545, 3866.54724117546, 320338.197537275, 918368.01990607 
), Mmor_mean = c(39113.5325249635, 119476.157216344, 1296530.34384725, 
23511.2980313616, 209092.538981888, 577355.581852083), Mtot_mean = c(23443.9874102442, 
81425.1369141232, 941046.53405635, 13688.9226362685, 264715.368259581, 
747861.800879077), tot_meanMe = c(258492586.999527, NA, NA, NA, 
NA, NA), tot_meanMm = c(246665241.110832, NA, NA, NA, NA, NA), 
    tot_sdMe = c(35569170.0311164, NA, NA, NA, NA, NA), tot_sdMm = c(30522099.9189256, 
    NA, NA, NA, NA, NA), Wteve_mean = c(10752.4381084666, 53658.8435672746, 
    715547.921685567, 3422.17220367207, 335384.199178456, 1013708.18845339 
    ), Wtmor_mean = c(29254.6414790837, 98804.8007431987, 1001344.20496027, 
    11541.8862121394, 217110.411645861, 571826.157099177), Wttot_mean = c(18681.9538387311, 
    73007.110928385, 838032.04308901, 6902.04963587237, 284695.433093058, 
    824330.175015869), tot_meanwte = c(278901499.672313, NA, 
    NA, NA, NA, NA), tot_meanwtm = c(235415566.775308, NA, NA, 
    NA, NA, NA), tot_sdwte = c(16743477.4011497, NA, NA, NA, 
    NA, NA), tot_sdwtm = c(3922418.43271348, NA, NA, NA, NA, 
    NA), diff_eve = c(0.72303994843767, 0.808331185101342, 0.818341730189196, 
    1.12985174650959, 0.955138012828161, 0.905949098928778), 
    diff_mor = c(1.33700262752933, 1.20921408998001, 1.29478988086689, 
    2.03704122525771, 0.963070068343606, 1.00966976533735), diff_tot = c(1.25490018938172, 
    1.11530419268331, 1.12292428650774, 1.98331269093204, 0.929819510568173, 
    0.907235745512628)), .Names = c("Meve_mean", "Mmor_mean", 
"Mtot_mean", "tot_meanMe", "tot_meanMm", "tot_sdMe", "tot_sdMm", 
"Wteve_mean", "Wtmor_mean", "Wttot_mean", "tot_meanwte", "tot_meanwtm", 
"tot_sdwte", "tot_sdwtm", "diff_eve", "diff_mor", "diff_tot"), row.names = c(NA, 
6L), class = "data.frame") 

В этих данных есть три колонок, которые я заинтересован в основном в:

diff_eve diff_mor diff_tot 
0.7230399 1.3370026 1.2549002 
0.8083312 1.2092141 1.1153042 
0.8183417 1.2947899 1.1229243 
1.1298517 2.0370412 1.9833127 
0.9551380 0.9630701 0.9298195 
0.9059491 1.0096698 0.9072357 

Я хотел бы создать новые кадры данных, выбранные значение в каждой из этих столбцов. Должно быть 6 новых кадров данных. Значения ниже 1 в столбце «diff_eve» должны быть в новом кадре данных, то же самое относится к значениям выше 1 = следующий кадр данных. Конечно, я хотел бы сохранить все столбцы из данных (tbl_comp).

Позвольте мне показать пример нового фрейма данных. Выбор значений ниже 1 в столбце diff_eve:

>newdata.frame 
diff_eve diff_mor diff_tot .. ....... ..... rest of the columns from tbl_comp. 
0.7230399 1.3370026 1.2549002 
0.8083312 1.2092141 1.1153042 
0.8183417 1.2947899 1.1229243 
0.9551380 0.9630701 0.9298195 
0.9059491 1.0096698 0.9072357 

Я надеюсь, что некоторые из вас поймут, чего я хочу достичь.

+0

ли ваши шесть набора данных соответствующих значений столбцов 'diff_eve',' diff_mor ',' diff_tot' отфильтрованы менее одного и более одного? – TheComeOnMan

+0

Извините за поздний ответ, но мне пришлось пойти в лабораторию. – Rechlay

ответ

3

Вот решение, которое дает вам шесть dataframes, в следующем порядке:

diff_eve <1 
diff_mor <1 
diff_tot <1 
diff_eve >1 
diff_mor >1 
diff_tot >1 

Код:

cols <- c("diff_eve", "diff_mor", "diff_tot") 
c(lapply(cols, function(x)subset(tbl_comp, eval(parse(text=x))<1)), lapply(cols, function(x)subset(tbl_comp, eval(parse(text=x))>1))) 

дает

[[1]] 
    Meve_mean Mmor_mean Mtot_mean tot_meanMe tot_meanMm tot_sdMe tot_sdMm Wteve_mean Wtmor_mean Wttot_mean tot_meanwte tot_meanwtm tot_sdwte tot_sdwtm diff_eve diff_mor diff_tot 
1 7774.442 39113.53 23443.99 258492587 246665241 35569170 30522100 10752.44 29254.64 18681.95 278901500 235415567 16743477 3922418 0.7230399 1.3370026 1.2549002 
2 43374.117 119476.16 81425.14   NA   NA  NA  NA 53658.84 98804.80 73007.11   NA   NA  NA  NA 0.8083312 1.2092141 1.1153042 
3 585562.724 1296530.34 941046.53   NA   NA  NA  NA 715547.92 1001344.20 838032.04   NA   NA  NA  NA 0.8183417 1.2947899 1.1229243 
5 320338.198 209092.54 264715.37   NA   NA  NA  NA 335384.20 217110.41 284695.43   NA   NA  NA  NA 0.9551380 0.9630701 0.9298195 
6 918368.020 577355.58 747861.80   NA   NA  NA  NA 1013708.19 571826.16 824330.18   NA   NA  NA  NA 0.9059491 1.0096698 0.9072357 

[[2]] 
    Meve_mean Mmor_mean Mtot_mean tot_meanMe tot_meanMm tot_sdMe tot_sdMm Wteve_mean Wtmor_mean Wttot_mean tot_meanwte tot_meanwtm tot_sdwte tot_sdwtm diff_eve diff_mor diff_tot 
5 320338.2 209092.5 264715.4   NA   NA  NA  NA 335384.2 217110.4 284695.4   NA   NA  NA  NA 0.955138 0.9630701 0.9298195 

[[3]] 
    Meve_mean Mmor_mean Mtot_mean tot_meanMe tot_meanMm tot_sdMe tot_sdMm Wteve_mean Wtmor_mean Wttot_mean tot_meanwte tot_meanwtm tot_sdwte tot_sdwtm diff_eve diff_mor diff_tot 
5 320338.2 209092.5 264715.4   NA   NA  NA  NA 335384.2 217110.4 284695.4   NA   NA  NA  NA 0.9551380 0.9630701 0.9298195 
6 918368.0 577355.6 747861.8   NA   NA  NA  NA 1013708.2 571826.2 824330.2   NA   NA  NA  NA 0.9059491 1.0096698 0.9072357 

[[4]] 

    Meve_mean Mmor_mean Mtot_mean tot_meanMe tot_meanMm tot_sdMe tot_sdMm Wteve_mean Wtmor_mean Wttot_mean tot_meanwte tot_meanwtm tot_sdwte tot_sdwtm diff_eve diff_mor diff_tot 
4 3866.547 23511.3 13688.92   NA   NA  NA  NA 3422.172 11541.89 6902.05   NA   NA  NA  NA 1.129852 2.037041 1.983313 

[[5]] 
    Meve_mean Mmor_mean Mtot_mean tot_meanMe tot_meanMm tot_sdMe tot_sdMm Wteve_mean Wtmor_mean Wttot_mean tot_meanwte tot_meanwtm tot_sdwte tot_sdwtm diff_eve diff_mor diff_tot 
1 7774.442 39113.53 23443.99 258492587 246665241 35569170 30522100 10752.438 29254.64 18681.95 278901500 235415567 16743477 3922418 0.7230399 1.337003 1.2549002 
2 43374.117 119476.16 81425.14   NA   NA  NA  NA 53658.844 98804.80 73007.11   NA   NA  NA  NA 0.8083312 1.209214 1.1153042 
3 585562.724 1296530.34 941046.53   NA   NA  NA  NA 715547.922 1001344.20 838032.04   NA   NA  NA  NA 0.8183417 1.294790 1.1229243 
4 3866.547 23511.30 13688.92   NA   NA  NA  NA 3422.172 11541.89 6902.05   NA   NA  NA  NA 1.1298517 2.037041 1.9833127 
6 918368.020 577355.58 747861.80   NA   NA  NA  NA 1013708.188 571826.16 824330.18   NA   NA  NA  NA 0.9059491 1.009670 0.9072357 

[[6]] 
    Meve_mean Mmor_mean Mtot_mean tot_meanMe tot_meanMm tot_sdMe tot_sdMm Wteve_mean Wtmor_mean Wttot_mean tot_meanwte tot_meanwtm tot_sdwte tot_sdwtm diff_eve diff_mor diff_tot 
1 7774.442 39113.53 23443.99 258492587 246665241 35569170 30522100 10752.438 29254.64 18681.95 278901500 235415567 16743477 3922418 0.7230399 1.337003 1.254900 
2 43374.117 119476.16 81425.14   NA   NA  NA  NA 53658.844 98804.80 73007.11   NA   NA  NA  NA 0.8083312 1.209214 1.115304 
3 585562.724 1296530.34 941046.53   NA   NA  NA  NA 715547.922 1001344.20 838032.04   NA   NA  NA  NA 0.8183417 1.294790 1.122924 
4 3866.547 23511.30 13688.92   NA   NA  NA  NA 3422.172 11541.89 6902.05   NA   NA  NA  NA 1.1298517 2.037041 1.983313 

Если вы хотите столбцы для критерия выбора перед вашим dataframes, как в вашем примере, вы можете использовать:

c(lapply(cols, function(x)subset(tbl_comp[,c(cols, setdiff(colnames(tbl_comp), cols))], eval(parse(text=x))<1)), lapply(cols, function(x)subset(tbl_comp[,c(cols, setdiff(colnames(tbl_comp), cols))], eval(parse(text=x))>1))) 
+0

Могу ли я каким-то образом разделить их на разные кадры данных? – Rechlay

+1

'lapply' дает вам список. Вы можете сохранить вывод команды выше в переменной, например. 'allframes', а затем доступ к одиночным алементам с помощью' allframes [[1]] 'и т. д. – user1981275

+0

Если вы хотите создать единый фрейм данных, вы можете сделать это аналогично решению DJack: 'subset (tbl_comp, diff_eve <1)' для первого фрейма данных и т. Д. – user1981275

1

Я не знаю, если я правильно понял вашу проблему, но здесь может быть решение:

diff_eve_below<-subset(tbl_comp, diff_eve<1) 
diff_eve_above<-subset(tbl_comp, diff_eve>1) 
diff_mor_below<-subset(tbl_comp, diff_mor<1) 
diff_mor_above<-subset(tbl_comp, diff_mor>1) 
diff_tot_below<-subset(tbl_comp, diff_tot<1) 
diff_tot_above<-subset(tbl_comp, diff_tot>1) 
+0

Ошибка при попытке запуска всех кодов «Ошибка в dput» $ diff_eve: объект типа «замыкание» не является подмножеством » – Rechlay

+0

@Rechlay заменит dput на tbl_comp (моя ошибка, я исправил его), но ответ пользователя1981275 намного шире;) – DJack

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