2016-12-22 5 views
0

У меня есть data.table, который выглядит как:R data.table правило с именем столбца в виде строки

>DT 
    ID Year Value ABC_1 ABC_2 ABC_3 
1: 3 2015  5  0  1  0 
2: 4 2015  2  1  0  1 
3: 5 2015  1  0  1  1 

То, что я хочу сделать для каждого ABC _... является:

> unique(DT[Year == 2015 & ABC_1 == 1, .(Year = Year, ABC = ABC_1, N = .N, MEAN = mean(Value))]) 
    Year ABC N MEAN 
1: 2015 1 1 2 
> unique(DT[Year == 2015 & ABC_2 == 1, .(Year = Year, ABC = ABC_2, N = .N, MEAN = mean(Value))]) 
    Year ABC N MEAN 
1: 2015 1 2 3 
> unique(DT[Year == 2015 & ABC_3 == 1, .(Year = Year, ABC = ABC_3, N = .N, MEAN = mean(Value))]) 
    Year ABC N MEAN 
1: 2015 1 2 1.5 

У меня есть более 20 столбцов с ABC _... и я хотел бы поместить это утверждение в цикл for. Моя проблема в том, что для выбора/правила требуется имя столбца. Она не работает с этим:

> abc_name <- names(DT)[names(DT) %like% 'ABC'] 
> abc_name 
[1] "ABC_1" "ABC_2" "ABC_3" 
> abc_row<- data.table(Year=0, ABC=0, N=0, MEAN=0) 
> for (i in 1: length(abc_name)){ 
+ 
+ temp_row <- unique(DT[Year == 2015 & abc_name[i] == 1, .(Year = Year, ABC = abc_name[i], N = .N, MEAN = mean(Value))]) 
+ abc_row <- rbind(abc_row, temp_row) 
+ } 
> abc_row 
    Year ABC N MEAN 
1: 0 0 0 0 

temp_row пуст ... Когда я изменяю abc_name[I] с ABC_1 это работает:

> abc_name <- names(DT)[names(DT) %like% 'ABC'] 
> abc_name 
[1] "ABC_1" "ABC_2" "ABC_3" 
> abc_row<- data.table(Year=0, ABC=0, N=0, MEAN=0) 
> for (i in 1: length(abc_name)){ 
+ 
+ temp_row <- unique(DT[Year == 2015 & ABC_1 == 1, .(Year = Year, ABC = ABC_1, N = .N, MEAN = mean(Value))]) 
+ abc_row <- rbind(abc_row, temp_row) 
+ } 
> abc_row 
    Year ABC N MEAN 
1: 0 0 0 0 
2: 2015 1 1 2 
3: 2015 1 1 2 
4: 2015 1 1 2 

Как я могу использовать abc_name в для петли что мой скрипт работает? Надеюсь, вы поймете мой вопрос, и кто-то может мне помочь.

ответ

0

шлейф через имя вектор («abc_name») с помощью lapply, применить логику в посте OP, получить значение столбца с get и rbind в list элементах.

lst <- lapply(abc_name, function(nm) 
      unique(DT[Year == 2015 & get(nm) == 1, 
      .(Year = Year, ABC = get(nm), N = .N, MEAN = mean(Value))])) 

rbindlist(lst) 
# Year ABC N MEAN 
#1: 2015 1 1 2.0 
#2: 2015 1 2 3.0 
#3: 2015 1 2 1.5 

Или другой вариант melt перекроить «широкий» до «длинный» формат, сгруппированных по «переменная» и «год», и указав логический индекс в «я» (value==1), суммировать набор данных

melt(DT, measure = abc_name)[value==1, .(ABC=1, N= .N, 
    MEAN= mean(Value)), .(variable, Year)][, variable := NULL][] 
# Year ABC N MEAN 
#1: 2015 1 1 2.0 
#2: 2015 1 2 3.0 
#3: 2015 1 2 1.5 
Смежные вопросы