У меня есть такой фрейм данных с более чем 100 столбцами:

ID  regulation press treat
1001 test1        0.2  b
1001 test1        1    c
1002 test2        2    s
1002 test2        3    s
1004 test1        4    s
1004 test1        5    f
1005 test2        6    w
1006 test2        6    u
1006 test2        1    h

У каждого идентификатора есть только одно правило, и только два возможных правила встречаются в базе данных (test1 и test2).

Я в основном хочу СУММИРОВАТЬ все уникальные вхождения идентификатора

Предполагаемый результат

test1: 2
test2: 3

Это означает, что test1 произошел в 2 уникальных идентификаторах, а test2 - в 3 уникальных идентификаторах.

r
1
maximusyoda 2 Ноя 2014 в 18:43

2 ответа

Лучший ответ

Пытаться

 rowSums(table(unique(df[, c("regulation", "ID")])))
 # test1 test2 
 #  2     3 

Или же

  table(unique(df[,c('regulation', 'ID')])[,"regulation"])
  #   test1 test2 
  #    2     3 

Или используя dplyr

library(dplyr)
count(unique(select(df, ID, regulation)), regulation)
#using the %>%, the above code would be
#df %>%
   #   select(ID, regulation)  
   #    unique() 
   #    count(regulation)

#  regulation n
#1      test1 2
#2      test2 3

Данные

 df <- structure(list(ID = c(1001L, 1001L, 1002L, 1002L, 1004L, 1004L, 
 1005L, 1006L, 1006L), regulation = c("test1", "test1", "test2", 
 "test2", "test1", "test1", "test2", "test2", "test2"), press = c(0.2, 
 1, 2, 3, 4, 5, 6, 6, 1), treat = c("b", "c", "s", "s", "s", "f", 
 "w", "u", "h")), .Names = c("ID", "regulation", "press", "treat"
 ), class = "data.frame", row.names = c(NA, -9L))
0
akrun 2 Ноя 2014 в 17:00

В дополнение к ответу Акруна, который отлично; вы можете легко сделать это, используя подход data.table.

library(data.table)
dt <- data.table(df)
rowSums(table(unique(dt[,ID, regulation])))
#test1 test2 
#2     3
0
milan 25 Июн 2016 в 00:08