在 R 中合并列具有相同值但大小写不同的行
In R Merging rows where a column has same value but different case
所以我有许多值 (x) 由于大小写问题而被分开的数据,我想合并所有这些值而忽略大小写并简单地在其他列(y 和 z)中添加值
我有一个像这样的数据框:
x y z
rain 2 40
Rain 4 50
RAIN 7 25
Wind 8 10
Snow 3 9
SNOW 11 25
我想要一个像这样的数据框:
x y z
Rain 13 115
Wind 8 10
Snow 14 34
您可以降低第一列的上限,然后进行汇总。
选项 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
虽然这会导致 table(可能不是您想要的,但值得注意),但我尚未确定如何更改 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))
尝试:
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
。 =18=]
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
所以我有许多值 (x) 由于大小写问题而被分开的数据,我想合并所有这些值而忽略大小写并简单地在其他列(y 和 z)中添加值
我有一个像这样的数据框:
x y z
rain 2 40
Rain 4 50
RAIN 7 25
Wind 8 10
Snow 3 9
SNOW 11 25
我想要一个像这样的数据框:
x y z
Rain 13 115
Wind 8 10
Snow 14 34
您可以降低第一列的上限,然后进行汇总。
选项 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
虽然这会导致 table(可能不是您想要的,但值得注意),但我尚未确定如何更改 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))
尝试:
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
。 =18=]
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