Элегантный способ объединения кадров данных в R?
Я хотел бы взять уникальные строки фрейма данных, а затем присоединить его к другой строке атрибутов. Затем мне хотелось бы подсчитать количество разновидностей, например количество уникальных плодов определенного типа или происхождения.
Первый фрейм данных имеет мой список фруктов:
fruits <- read.table(header=TRUE, text="shop fruit
1 apple
2 orange
3 apple
4 pear
2 banana
1 banana
1 orange
3 banana")
Второй кадр данных имеет мои атрибуты:
fruit_class <- read.table(header=TRUE, text="fruit type origin
apple pome asia
banana berry asia
orange citrus asia
pear pome newguinea")
Здесь мое неуклюжее решение проблемы:
fruit <- as.data.frame(unique(fruit[,2])) #get a list of unique fruits
colnames(fruit)[1] <- "fruit" #this won't rename the column and I don't know why...
fruit_summary <- join(fruits, fruit_class, by="fruit" #create a data frame that I can query
count(fruit_summary, "origin") #for eg, summarise the number of fruits of each origin
Поэтому мой главный вопрос: как это можно выразить более элегантно (т.е. Одна строка, а не 3)? Вторично: почему он не позволит мне переименовать столбец?
заранее спасибо
Просто делать
table(fruit_class$fruit, fruit_class$origin)
дает тебе
asia newguinea
apple 1 0
banana 1 0
orange 1 0
pear 0 1
Вы можете добавить номера colSums()
с помощью colSums()
. Я не могу думать о причине fruits
требуется кадр данных, потому что, если есть фрукты здесь не в fruit_class
, нет никаких данных происхождения для него в любом случае.
Кстати, в вашем примере кода, colnames(fruit)[1] <- "fruit"
должны работать, но colnames(fruit) <- "fruit"
только colnames(fruit) <- "fruit"
так как colnames всего 1 элемент длинный в любом случае.
Вот решение data.table
.
library(data.table)
setDT(fruit_class)[, uniqueN(fruit), by=type]
# type V1
# 1: pome 2
# 2: berry 1
# 3: citrus 1
setDT(fruit_class)[, uniqueN(fruit), by=origin]
# origin V1
# 1: asia 3
# 2: newguinea 1