在dplyr中将starts_with与group_by组合在一起

时间:2016-01-23 14:44:52

标签: r dplyr

我想这可能是一个简单的伎俩,但我不知道如何实现它......

我的日期设置如下:

Name, Score
A a,  20
A,    30
B b,   40

我期望的输出是:

Name, Score
A,    50
B,    40

总之,将具有以相同单词开头的名称的分数相加(如果有空格,则在空格之前)。我希望这个例子不言自明。 :)

PS:代码运行得越快越好。数据集很大......

4 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

library(dplyr)
library(stringr)

df$newName <- str_extract(df$Name, '[[:alnum:]]+')
df %>% group_by(newName) %>% summarise(Score = sum(Score))

Source: local data frame [2 x 2]

  newName Score
    (chr) (int)
1       A    50
2       B    40

注意,您需要确保将“名称”读取为字符向量而不是因子。在您的通话中使用stringsAsFactors = FALSE,或使用as.character进行转换。

如果你想要完整的第一个'字符串',你也可以使用这个正则表达式模式:

df$newName <- str_extract(df$Name, '([^\\s]+)')

答案 1 :(得分:2)

starts_with用于selectrename,并且对列名称的操作不在列中的值上。通过使用gsub,您可以提取第一个字母(或单词),然后进行汇总。用:

sumdf <- mydf %>% 
  group_by(Name = gsub("[^A-Za-z0-9].*", "", Name)) %>% 
  summarise(sumScore = sum(Score))

你得到:

> sumdf
   Name sumScore
1     A       50
2     B       40

答案 2 :(得分:1)

我使用substr提取第一个字母然后group_by。我相信dplyr starts_with用于根据标题选择整列。只有当您要选择的字母始终是第一个字母时,此解决方案才有效。

require(dplyr)
df<-data.frame(Name=c("A a,","A,","B b"),Score=c(20,30,40))

df$Name <- substr(df$Name,1,1)
df %>% group_by(Name) %>% summarise(sum_score=sum(Score))

Source: local data frame [2 x 2]

   Name sum_score
  (chr)     (dbl)
1     A        50
2     B        40

如果您想保留原始数据,也可以将子字符串列创建为新列和组。

答案 3 :(得分:1)

另一种选择是Content Security Policy: The page's settings blocked the loading of a resource

http vs https

separate

library(dplyr)
library(tidyr)
separate(df1, Name, into=c("Name", "extra")) %>% 
       group_by(Name) %>%
       summarise(Score=sum(Score))
#     Name Score
#    (chr) (int)
#1     A    50
#2     B    40