我想用dplyr在每个组中选择一个具有最大值的行.
首先,我生成一些随机数据来显示我的问题
set.seed(1)
df <- expand.grid(list(A = 1:5, B = 1:5, C = 1:5))
df$value <- runif(nrow(df))
Run Code Online (Sandbox Code Playgroud)
在plyr中,我可以使用自定义函数来选择此行.
library(plyr)
ddply(df, .(A, B), function(x) x[which.max(x$value),])
Run Code Online (Sandbox Code Playgroud)
在dplyr中,我使用此代码来获取最大值,但不是具有最大值的行(在本例中为C列).
library(dplyr)
df %>% group_by(A, B) %>%
summarise(max = max(value))
Run Code Online (Sandbox Code Playgroud)
我怎么能实现这个目标?谢谢你的任何建议.
sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
[5] LC_TIME=English_Australia.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_0.2 plyr_1.8.1
loaded via a namespace (and not attached):
[1] assertthat_0.1.0.99 parallel_3.1.0 Rcpp_0.11.1 …Run Code Online (Sandbox Code Playgroud) 我有一个带有分组变量("Gene")和值变量("Value")的数据框:
Gene Value
A 12
A 10
B 3
B 5
B 6
C 1
D 3
D 4
Run Code Online (Sandbox Code Playgroud)
对于我的分组变量的每个级别,我希望提取最大值.因此,结果应该是一个数据框,每个级别的分组变量有一行:
Gene Value
A 12
B 6
C 1
D 4
Run Code Online (Sandbox Code Playgroud)
可以aggregate做到的伎俩?
我希望(1)通过一个变量()分组数据State,(2)在每个组内找到另一个变量(Employees)的最小值行,以及(3)提取整行.
(1)和(2)是简单的单行,我觉得(3)也应该是,但我不能得到它.
这是一个示例数据集:
> data
State Company Employees
1 AK A 82
2 AK B 104
3 AK C 37
4 AK D 24
5 RI E 19
6 RI F 118
7 RI G 88
8 RI H 42
data <- structure(list(State = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L), .Label = c("AK", "RI"), class = "factor"), Company = structure(1:8, .Label = c("A",
"B", "C", "D", "E", "F", "G", "H"), class = "factor"), Employees …Run Code Online (Sandbox Code Playgroud) 假设我有一个包含一些棒球运动员的数据表:
library(plyr)
library(data.table)
bdt <- as.data.table(baseball)
Run Code Online (Sandbox Code Playgroud)
对于每个玩家(由id给出),我想找到与他们玩最多游戏的年份相对应的行.这在plyr中很简单:
ddply(baseball, "id", subset, g == max(g))
Run Code Online (Sandbox Code Playgroud)
data.table的等效代码是什么?
我试过了:
setkey(bdt, "id")
bdt[g == max(g)] # only one row
bdt[g == max(g), by = id] # Error: 'by' or 'keyby' is supplied but not j
bdt[, .SD[g == max(g)]] # only one row
Run Code Online (Sandbox Code Playgroud)
这有效:
bdt[, .SD[g == max(g)], by = id]
Run Code Online (Sandbox Code Playgroud)
但它比plyr快30%,这表明它可能不是惯用语.
a <- c(rep(1:2,3))
b <- c("A","A","B","B","B","B")
df <- data.frame(a,b)
> str(b)
chr [1:6] "A" "A" "B" "B" "B" "B"
a b
1 1 A
2 2 A
3 1 B
4 2 B
5 1 B
6 2 B
Run Code Online (Sandbox Code Playgroud)
我想按变量分组a并返回最常用的值b
我想要的结果看起来像
a b
1 1 B
2 2 B
Run Code Online (Sandbox Code Playgroud)
在dplyr它会是这样的
df %>% group_by(a) %>% summarize (b = most.frequent(b))
Run Code Online (Sandbox Code Playgroud)
我dplyr只提到可视化问题.
我有一个有两行的数据框:
| code | name | v1 | v2 | v3 | v4 |
|------|-------|----|----|----|----|
| 345 | Yemen | NA | 2 | 3 | NA |
| 346 | Yemen | 4 | NA | NA | 5 |
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法来合并这两行?如果我在"346"中重命名"345"会更容易吗?
我有一个180,000 x 400的数据框,其中行对应于用户,但每个用户只有两行.
id date ...
1 2012 ...
3 2010 ...
2 2013 ...
2 2014 ...
1 2011 ...
3 2014 ...
Run Code Online (Sandbox Code Playgroud)
我希望对数据进行子集化,以便仅保留每个用户的最新行(即每个id的日期值最高的行).
我首先尝试使用which()循环语句,其中ids的ifelse()语句sapply()很慢(O(n^2)我相信).
然后我尝试对dfby进行排序id,然后以2的增量循环并比较相邻的日期,但这也很慢(我想因为R中的循环是没有希望的).这两个日期的比较是瓶颈,因为排序几乎是即时的.
有没有办法对比较进行矢量化?
解决方案来自删除重复项,保持最大绝对值的输入
aa <- df[order(df$id, -df$date), ] #sort by id and reverse of date
aa[!duplicated(aa$id),]
Run Code Online (Sandbox Code Playgroud)
跑得很快!!
>ID<-c('A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C')
>WK<-c(1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5)
>NumSuccess<-c(0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 3)
>Data<-data.frame(ID, WK, NumSuccess)
Run Code Online (Sandbox Code Playgroud)
我正在尝试根据"NumSuccesses"中的值创建子集data.frame"Data2",该值对应于"ID"中按"ID"分组的"WK"中的最大值.生成的data.frame应如下所示:
>ID<-c('A','B','C')
>WK<-c(3, 3, 5)
>NumSuccess<-c(2, 1, 3)
>Data2<-data.frame(ID, WK, NumSuccess)
Run Code Online (Sandbox Code Playgroud) 我有以下内容 df
dat <- data.frame(Cases = c("Student3","Student3","Student3","Student1","Student1",
"Student2","Student2","Student2","Student4"), Class = rep("Math", 9),
Scores = c(9,5,2,7,3,8,5,1,7), stringsAsFactors = F)
> dat
Cases Class Scores
1 Student3 Math 9
2 Student3 Math 5
3 Student3 Math 2
4 Student1 Math 7
5 Student1 Math 3
6 Student2 Math 8
7 Student2 Math 5
8 Student2 Math 1
9 Student4 Math 7
Run Code Online (Sandbox Code Playgroud)
另一方面,我有另一个df,其中包含以下信息:
d <- data.frame(Cases = c("Student3", "Student1",
"Student2", "Student4"), Class = rep("Math", 4), stringsAsFactors = F)
Cases Class
1 Student3 Math …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 R 包RecordLinkage将采购订单列表中的项目与主目录中的条目进行匹配。下面是 R 代码和使用两个虚拟数据集(DOrders 和 DCatalogue)的可重现示例:
DOrders <- structure(list(Product = structure(c(1L, 2L, 7L, 3L, 4L, 5L,
6L), .Label = c("31471 - SOFTSILK 2.0 SCREW 7mm x 20mm", "Copier paper white A4 80gsm",
"High resilience memory foam standard mattress", "Liston forceps bone cutting 152mm",
"Micro reciprocating blade 25.4mm x 8.0mm x 0.38mm", "Micro reciprocating blade 39.5 x 7.0 x 0.38",
"microaire dual tooth 18 x 90 x 0.89"), class = "factor"), Supplier = structure(c(5L,
6L, 2L, 1L, 4L, …Run Code Online (Sandbox Code Playgroud) r ×10
data.table ×3
dataframe ×3
dplyr ×3
aggregate ×2
coalesce ×1
data-linking ×1
duplicates ×1
filtering ×1
linkage ×1
plyr ×1
subset ×1