相关疑难解决方法(0)

如何使用dplyr选择每组中具有最大值的行?

我想用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)

r plyr greatest-n-per-group dplyr

98
推荐指数
4
解决办法
9万
查看次数

提取数据框中每个组内的最大值

我有一个带有分组变量("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做到的伎俩?

aggregate r

61
推荐指数
2
解决办法
9万
查看次数

按组提取对应于变量最小值的行

我希望(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)

aggregate r dplyr data.table

58
推荐指数
5
解决办法
6万
查看次数

使用data.table按组进行子集化

假设我有一个包含一些棒球运动员的数据表:

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%,这表明它可能不是惯用语.

r greatest-n-per-group data.table

51
推荐指数
1
解决办法
2万
查看次数

返回每个组的最常见字符串值

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只提到可视化问题.

r summarization

20
推荐指数
2
解决办法
1万
查看次数

合并行中不相交且包含NA的数据帧中的行

我有一个有两行的数据框:

| 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"会更容易吗?

r coalesce dataframe dplyr data.table

14
推荐指数
1
解决办法
2万
查看次数

按每组中的最大值过滤数据帧

我有一个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()循环语句,其中idsifelse()语句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)

跑得很快!!

filtering r dataframe

13
推荐指数
2
解决办法
7235
查看次数

R子集data.frame从一个向量的最大值开始并按另一个向量分组

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

r subset

5
推荐指数
1
解决办法
4527
查看次数

按组选择数据框中的最高值

我有以下内容 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 dataframe

5
推荐指数
1
解决办法
138
查看次数

RecordLinkage:如何仅配对最佳匹配并导出合并表?

我正在尝试使用 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 duplicates linkage fuzzy-comparison data-linking

4
推荐指数
1
解决办法
1564
查看次数