объединяться в 2 группы

Я пытаюсь понять, как агрегировать мой вывод. Я создал некоторые фиктивные данные, которые аппроксимируют мои фактические данные, а именно: сотни групп group1, 3 уровня группы2 и несколько десятков логических проверок. Извините, если это кажется простым, я много охотился и клевал, и должен сказать, что, будучи новичком в R, огромное разнообразие инструментов (семейство приложений, ddply, агрегат, таблица, изменение формы и т. д.) одновременно прекрасно и немного страшно :)

 #create data
group1 <- paste("Group", rep(LETTERS[1:7], sep=''))
group2 <- c("UNC", "UNC", "SS", "LS", "LS", "SS", "UNC")
valid1 <- c("Y", "N", NA, "N", "Y", "Y", "N")
valid2 <- c("N", "N", "Y", "N", "N", "Y", "N")
valid3 <- c(1.4, 1.2, NA, 0.7, 0.3, NA, 1.7)
valid4 <- c(0.4, 0.3, 0.53, 0.66, 0.3, 0.3, 0.71)
valid5 <- c(8.5, 11.2,NA, NA, 8.3, NA, 11.7)

testdata <- data.frame(cbind(group, group2, valid1, valid2, valid3, valid4, valid5))

valid <- function(testdata){
  for(i in group)
    val1 <- ifelse(valid1=="Y", 1,0)
     val2 <- ifelse(valid2=="Y", 1,0)
      val3 <- ifelse(valid3>=1.0, 1,0)
      val4 <- ifelse(valid4<=0.5, 1,0)
       val5 <- ifelse(valid5>=10.0, 1,0)

  test.out <- data.frame(cbind(group1,group2, val1, val2, val3, val4, val5))

}
validtry <- valid(testdata)'

Затем мне нужно преобразовать эти логические выражения в числовые, чтобы их можно было суммировать:

#make validations numeric
# why doesn't this work:
# validtry[,3:7] <- as.numeric(validtry[,3:7])
#but these do
validtry[,3] <- as.numeric(validtry[,3])
validtry[,4] <- as.numeric(validtry[,4])
validtry[,5] <- as.numeric(validtry[,5])
validtry[,6] <- as.numeric(validtry[,6])
validtry[,7] <- as.numeric(validtry[,7])
######

#summarize validtry
#sum on both groups
aggregate(validtry[,3:7], by=list(validtry$group1, validtry$group2), sum, na.rm=T)

#sum on one group
aggregate(validtry[,3:7], by=list(validtry$group2), sum, na.rm=T)

Итак, эти два последних сближают меня, но я думаю, что мне нужно что-то другое? Я пытаюсь суммировать строки и столбцы для двух групп. Я знаком с tapply, но, похоже, не понимаю.

заранее спасибо!!


person isotopesforbreakfast    schedule 06.09.2014    source источник
comment
Вам не нужно data.frame(cbind(.., вместо этого testdata <- data.frame(group1, group2, valid1, valid2, valid3, valid4, valid5)   -  person akrun    schedule 06.09.2014
comment
Вам также не нужно as.numeric для суммирования логических векторов. Они имеют числовые значения 0 для FALSE и 1 для TRUE.   -  person Rich Scriven    schedule 06.09.2014
comment
Вам нужно исправить имя group1. Это «group1» при создании, а затем просто «group». Энди, если вы не скажете, каковы правильные ответы, то цель суммирования по строкам и столбцам для двух групп слишком расплывчата, чтобы знать, как ее правильно реализовать.   -  person IRTFM    schedule 06.09.2014
comment
@Майкл Слэттери В вашем group1 есть семь уникальных levels. Ваш примерный набор данных nrow равен 7. Таким образом, среднее значение будет 7 значений для каждого valid столбца. Непонятно, чего вы ожидаете в результате. Было бы проще, если бы вы также показали ожидаемый результат.   -  person akrun    schedule 06.09.2014


Ответы (1)


Насчет ожидаемого результата не ясно. Я предполагаю:

 testdata <- data.frame(group1, group2, valid1, valid2, valid3, valid4, valid5)
 str1 <- c("valid1=='Y'", "valid2=='Y'", "valid3>=1.0", "valid4 <=0.5", "valid5>=10.0")
 validtry <- testdata

 #Though I used eval(parse(...)), it is not that recommended 
 validtry[,-(1:2)] <- lapply(str1, function(x) 1*with(testdata, eval(parse(text=x))))

 library(reshape2) 
 lst <-  lapply(validtry[3:7], function(x)
       dcast(data.frame(validtry[1:2], x), group1~group2, value.var="x", sum, na.rm=TRUE))

 lst[[1]]
 #   group1 LS SS UNC
 #1 Group A  0  0   1
 #2 Group B  0  0   0
 #3 Group C  0  0   0
 #4 Group D  0  0   0
 #5 Group E  1  0   0
 #6 Group F  0  1   0
 #7 Group G  0  0   0
person akrun    schedule 06.09.2014