我想这可能是一个简单的伎俩,但我不知道如何实现它......
我的日期设置如下:
Name, Score
A a, 20
A, 30
B b, 40
我期望的输出是:
Name, Score
A, 50
B, 40
总之,将具有以相同单词开头的名称的分数相加(如果有空格,则在空格之前)。我希望这个例子不言自明。 :)
PS:代码运行得越快越好。数据集很大......
答案 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
用于select
和rename
,并且对列名称的操作不在列中的值上。通过使用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