在 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_bysummarise。 =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