在R合并行中,列具有相同的值但具有不同的大小写

时间:2015-09-24 23:28:22

标签: r dplyr reshape summary

所以我有数据,其中许多值(x)因案例问题而被分离,我想合并所有这些值而忽略大小写并简单地在其他列中添加值(y和z)

我有一个类似的数据框:

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 个答案:

答案 0 :(得分:4)

您可以降低第一列的上限,然后进行汇总。

选项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))

答案 1 :(得分:3)

尝试:

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

答案 2 :(得分:1)

如果您想要保留title个案,因为它似乎使用stringr个包,而dplyr用于group_bysummarise

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