В R Слияние строк, где столбец имеет одинаковое значение, но в другом случае

Итак, у меня есть данные, где многие значения (x) были разделены из-за проблемы case, и я хотел бы объединить все эти значения, игнорируя регистр, и просто добавляя значения в другие столбцы (y и z)

У меня есть dataframe like:

x y z 
rain 2 40
Rain 4 50
RAIN 7 25
Wind 8 10
Snow 3 9
SNOW 11 25

Мне нужен Dataframe:

x y z
Rain 13 115
Wind 8 10
Snow 14 34
3 ответа

Вы можете опустить колпачки в первом столбце и затем заполнить.

Вариант 1: база R aggregate()

with(df, aggregate(list(y = y, z = z), list(x = tolower(x)), sum))
# x y z
# 1 rain 13 115
# 2 snow 14 34
# 3 wind 8 10

Альтернативно, метод формулы также может быть использован.

aggregate(. ~ x, transform(df, x = tolower(x)), sum)

Вариант 2: data.table. Это также сохраняет порядок, который вы показываете в результате.

library(data.table)
as.data.table(df)[, lapply(.SD, sum), by = .(x = tolower(x))]
# x y z
# 1: rain 13 115
# 2: wind 8 10
# 3: snow 14 34

Чтобы заказать результат, используйте keyby вместо by

Вариант 3: база R xtabs()

xtabs(cbind(y = y, z = z) ~ tolower(x), df)
# 
# tolower(x) y z
# rain 13 115
# snow 14 34
# wind 8 10

хотя это приводит к таблице (возможно, не то, что вы хотите, но стоит отметить), и мне еще предстоит определить, как изменить имя в x результате.

Данные:

df <- tructure(list(x = structure(c(1L, 2L, 3L, 6L, 4L, 5L), .Label = c("rain", 
"Rain", "RAIN", "Snow", "SNOW", "Wind"), class = "factor"), y = c(2L, 
4L, 7L, 8L, 3L, 11L), z = c(40L, 50L, 25L, 10L, 9L, 25L)), .Names = c("x", 
"y", "z"), class = "data.frame", row.names = c(NA, -6L))


Try:

library(dplyr)
df %>%
 group_by(x = tolower(x)) %>%
 summarise_each(funs(sum))

Что дает:

#Source: local data frame [3 x 3]
#
# x y z
# (chr) (int) (int)
#1 rain 13 115
#2 snow 14 34
#3 wind 8 10


если вы хотите сохранить случай title, поскольку он использует пакет stringr для этого и dplyr для group_by и summarise.

require(dplyr) 
summarise_each(group_by(df,x=stringr::str_to_title(x)),funs(sum))

где df - ваш кадр данных. Это дает результат как

x y z
 (chr) (int) (int)
1 Rain 13 115
2 Snow 14 34
3 Wind 8 10

licensed under cc by-sa 3.0 with attribution.