2016-09-02 8 views
1

Существует таблица показана нижеГраф наиболее частое слово в строке с помощью R

Name  Mon Tue  Wed Thu  Fri Sat Sun 

1 John  Apple Orange Apple Banana Apple Apple Orange 
2 Ricky Banana Apple Banana Banana Banana Banana Apple 
3 Alex  Apple Orange Orange Apple Apple Orange Orange 
4 Robbin Apple Apple Apple Apple Apple Banana Banana 
5 Sunny Banana Banana Apple Apple Apple Banana Banana 

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

Например.

Name  Mon Tue  Wed Thu  Fri Sat Sun  Max_Acc Count 

1 John  Apple Orange Apple Banana Apple Apple Orange  Apple  4 
2 Ricky Banana Apple Banana Banana Banana Banana Apple  Banana  5 
3 Alex  Apple Orange Orange Apple Apple Orange Orange  Orange  4 
4 Robbin Apple Apple Apple Apple Apple Banana Banana  Apple  5 
5 Sunny Banana Banana Apple Apple Apple Banana Banana  Banana  4 

Я столкнулся с проблемой поиска строк. Я могу найти частоту в столбце, используя функцию table().

Но здесь я хочу, чтобы имя наиболее часто встречающихся фруктов в новой колонке.

+0

Пожалуйста, сообщите 'dput' свои данные. Может быть, df [1,] решает вашу проблему. – Christoph

+0

@Christoph Но есть 2k Rows, поэтому он будет жестким для запуска от 1 до 2 тысяч раз. –

+0

Мне нужен только образец, например. строка 1-10 ;-) – Christoph

ответ

2

Если нужно «Count» и «имена», соответствующие «Count» max, мы цикл по строкам набора данных (с помощью apply с MARGIN = 1), использовать table, чтобы получить частоту, извлекать максимальное значение из его и names, соответствующих максимальному значению, rbind и cbind с исходным набором данных.

cbind(df1, do.call(rbind, apply(df1[-1], 1, function(x) { 
       x1 <- table(x) 
      data.frame(Count = max(x1), Names=names(x1)[which.max(x1)])}))) 

# Name Mon Tue Wed Thu Fri Sat Sun Count Names 
#1 John Apple Orange Apple Banana Apple Apple Orange  4 Apple 
#2 Ricky Banana Apple Banana Banana Banana Banana Apple  5 Banana 
#3 Alex Apple Orange Orange Apple Apple Orange Orange  4 Orange 
#4 Robbin Apple Apple Apple Apple Apple Banana Banana  5 Apple 
#5 Sunny Banana Banana Apple Apple Apple Banana Banana  4 Banana 

Или мы можем использовать data.table

library(data.table) 
setDT(df1)[, c("Names", "Count") := {tbl <- table(unlist(.SD)) 
        .(names(tbl)[which.max(tbl)], max(tbl))}, by = Name] 
1

Другой подход был бы перебрать всех уникальных фруктов следующим

fruits_unique <- unique(unlist(dat[-1])) 
occurence <- sapply(fruits_unique, function(x) rowSums(dat[,-1] == x)) 
# Using this data to create the resulting columns 
ind <- apply(occurence,1,which.max) 
dat$Names <- fruits_unique[ind] 
dat$count <- occurence[cbind(seq_along(ind), ind)] 

Результат:

Name Mon Tue Wed Thu Fri Sat Sun Names Count 
1 John Apple Orange Apple Banana Apple Apple Orange Apple  4 
2 Ricky Banana Apple Banana Banana Banana Banana Apple Banana  5 
3 Alex Apple Orange Orange Apple Apple Orange Orange Orange  4 
4 Robbin Apple Apple Apple Apple Apple Banana Banana Apple  5 
5 Sunny Banana Banana Apple Apple Apple Banana Banana Banana  4