Подсчет количества записей с условиями в кадре данных в R (универсальный) - PullRequest
1 голос
/ 07 июня 2019

У меня есть датафрейм с тысячами записей. Я не знаю названия и количество столбцов. Как я могу подсчитать количество элементов, которые имеют одинаковые значения во всех столбцах, кроме последнего ?

Обычно я бы просто сделал:

nrow(subset(df, attr1 == value1 & attr2 == value2 & attr3 == value3))

Но в этом случае я не знаю, сколько атрибутов до запуска этого кода.

Учтите, что все запрошенные значения (value1, value2 ...) хранятся в переменной x, построенной следующим образом:

 x = df[i,]

Я пытался с

nrow(subset(df, colnames(df)[1:(ncol(df) - 1)] == x[1:(ncol(df) - 1)]))

но это производит 0

Я добавляю некоторую информацию о моем наборе данных в качестве ссылки. Запуск этого кода:

print(x)
print(colnames(df))
print(head(df))

Я получаю следующий вывод:

377   3rd Male Adult       No
[1] "Class"    "Sex"      "Age"      "Survived"
  Class  Sex   Age Survived
1   3rd Male Child       No
3   3rd Male Child       No
4   3rd Male Child       No
5   3rd Male Child       No
6   3rd Male Child       No
7   3rd Male Child       No

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Следующая функция выполняет то, о чем спрашивает вопрос.
Сначала она удаляет последний элемент x и последний столбец DF.
Затем Reduce применяет функцию '==' ксписок новых x и каждой из строк нового DF.

countEqual <- function(DF, X){
  X <- X[-length(X)]
  DF <- DF[-ncol(DF)]
  eq <- apply(DF, 1, function(y){
    all(Reduce('==', list(X, y)))
  })
  sum(eq)
}

x <- c("3rd", "Male", "Adult", "No")

countEqual(df, x)
#[1] 0

countEqual(df, c("3rd", "Male", "Child", "No"))
#[1] 6

Код создания тестовых данных.

Этонабор данных в вопросе с еще 20 строками.

df <- read.table(text = "
  Class  Sex   Age Survived
1   3rd Male Child       No
3   3rd Male Child       No
4   3rd Male Child       No
5   3rd Male Child       No
6   3rd Male Child       No
7   3rd Male Child       No                 
", header = TRUE, stringsAsFactors = FALSE)

set.seed(1234)
n <- 20
Class <- sample(c("1st", "2nd", "4th"), n, TRUE)
Sex <- sample(c("Male", "Female"), n, TRUE)
Age <- sample(c("Child", "Adult"), n, TRUE)
Survived <- sample(c("Yes", "No"), n, TRUE)
df2 <- data.frame(Class, Sex, Age, Survived)

df <- rbind(df, df2)
df <- df[with(df, order(Class, Sex, Age, Survived)), ]
row.names(df) <- NULL
0 голосов
/ 07 июня 2019

Это должно сработать.

library(dplyr) ## for %>%
allDuplicated <- function(data){
  tmp <- data[,-ncol(data)]
  n <- ncol(tmp)
  apply(tmp, 1,function(x){ sum(x == x[1]) == n}) %>% unlist(.)
}

matrix <- matrix(c(rep(1,3),c(0,1,2)),2,3)
allDuplicated(mat)

Вы хотите знать, одинаковы ли все ваши функции? Итак, сначала мы создаем набор данных tmp, по которому вы хотите знать строки без отклонений. Следовательно, если все значения совпадают с первым, вы должны устранить это. Затем мы просто применяем набор данных, проверяем, все ли значения x (теперь строки в tmp) равны первому, и возвращаем TRUE, если они есть. Итак, теперь у вас есть индексы строк, которые я хочу удалить.

...