我有一个看起来像这样的数据框:
class ID rank
a AA win
b AA win
b AB win
c BB win
d AB win
e BB win
e AA win
我如何才能最有效地计算每wins
个ID
e
,df.write.mode(SaveMode.Overwrite).save("/root/path/to/data/partition_col=value")
类的条件低于sc.hadoopConfiguration.set("parquet.enable.summary-metadata", "false")
(不包括在内)?
答案 0 :(得分:2)
也许这一个:
aggregate(rank~ID, df[as.character(df$class)<"e",], length)
# ID rank
#1 AA 2
#2 AB 2
#3 BB 1
至于@Richard Scriven在评论中指出的内容(感谢你):
字符向量中字符串的比较是使用正在使用的语言环境的整理顺序在字符串中进行词典编排
如果我们运行Sys.getlocale()
,我们会得到:
[1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United
States.1252;LC_MONETARY=English_United
States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"
我们可以使用以下内容设置区域设置:
Sys.getlocale("LC_TIME") #LC_TIME for example
有关详细信息,请参阅?locales
。
答案 1 :(得分:0)
dplyr解决方案:
library(dplyr)
df%>% group_by(ID) %>% filter(class !="e") %>%summarize(n())
答案 2 :(得分:0)
我们也可以使用data.table
。将'data.frame'转换为'data.table'(setDT(df)
),按'ID'分组,使用逻辑表达式i
指定class != "e"
并获取行(.N
)。
library(data.table)
setDT(df)[class != "e",.(N = .N), by = ID]
# ID N
#1: AA 2
#2: AB 2
#3: BB 1