2013-05-08 3 views
0

Фон: у меня есть кадр данных с одним столбцом, имеющим повторяющиеся значения. Я пытаюсь разбить этот фрейм данных, выбирая все строки с повторяющимися значениями столбцов, обрабатывая их, а затем выплевывая новый кадр данных со всеми обработанными строками.Поведение подмножества данных для уникальных значений столбцов

Я поражен тем, что происходит не так здесь в следующем коде:

dataSet <- structure(list(DAY = structure(1:10, .Label = c("Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday"), class = "factor"), 
     variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
     1L), .Label = c("act1", "act2", "act3", "act4", 
     "act5", "act12", "act19", "act116", "act22", 
     "act6", "act13", "act111", "act117", "act23", 
     "act7", "act14", "act112", "act118", "act24", 
     "act8", "act15", "act113", "act119", "act25", 
     "act9", "act16", "act114", "act20", "act26", 
     "act10", "act17", "act115", "act21", "act27", 
     "act11", "act18"), class = "factor"), value = c(67, 
     65, 40, 79, 106, 90, 57, 59, 2, 12)), .Names = c("DAY", 
    "variable", "value"), row.names = c(NA, 10L), class = "data.frame") 


uniq <- unique(dataSet$variable) 
for (i in 1:length(uniq)){ 
    rowsPerVal <- dataSet[dataSet$variable == uniq[i], ] 
    print(length(rowsPerVal)) 
} 

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

+3

«длина» кадра данных - это количество столбцов, так как оно фактически является списком. Вероятно, вы имели в виду «nrow» или что-то еще. – joran

+0

У вас есть только одно значение в «uniq» в вашем примере. Этого достаточно, чтобы проиллюстрировать вашу проблему? О, неважно, прав Джоран: 'print (nrow (...)) вместо этого. Или лучше, просто «print (sum (dataSet $ ​​variable == uniq [i])) и пропустите строку выше. Конечно, есть способ сделать это и без циклов. – Frank

ответ

3

plyr также хорош для этого разделенного применить-скомбинировать проблему (расщепленные набор данных на куски, работают на каждом из них, и положить обратно вместе).

library("plyr") 
ddply(dataSet, .(variable), nrow) 

Как уже сказал length() из data.frame это количество столбцов; nrow() - количество строк.

> ddply(dataSet, .(variable), nrow) 
    variable V1 
1  act1 10 

Вы можете заменить nrow с (анонимной) функция, которая делает то, что обработка вы хотите.

1

duplicated возвращает TRUE только для входа 2 + th. Таким образом, вы можете использовать его, чтобы индексировать строки:

dataSet[duplicated(dataSet$variable),] 

Вы также можете назначить им:

dataSet[duplicated(dataSet$variable),]$value <- NA 
> dataSet 
     DAY variable value 
1 Tuesday  act1 67 
2 Tuesday  act1 NA 
3 Tuesday  act1 NA 
4 Tuesday  act1 NA 
5 Tuesday  act1 NA 
6 Tuesday  act1 NA 
7 Tuesday  act1 NA 
8 Tuesday  act1 NA 
9 Tuesday  act1 NA 
10 Tuesday  act1 NA 

К «выплюнуть новый кадр данных со всех обработанных строк», вы можете просто обработать subsetted data.frame, как вам нравится:

newDF <- transform(dataSet[duplicated(dataSet$variable),], DAY=sub("esd","foo",DAY)) 
+0

Я не вижу, как это связано с вопросом. –

+0

@BrianDiggs Вопрос немного неоднозначен, но «разделить этот фрейм данных, выбирая все строки с повторяющимися значениями столбцов» был тем, на что Iw фокусировался, так как это то, что он пытается с помощью 'unique'. Я изменю свой ответ, чтобы правильно ответить на его вторую часть, «выплюнуть новый кадр данных со всеми обработанными строками». –

+0

Моя забота заключалась в том, что «duplicated» не идентифицирует все строки в группе (одной строки на группу нет, а все вторичные строки сгруппированы вместе в одну группу). Ваше редактирование затрагивает то, что я думал. Снятие голоса: –

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