逐行选择因子

Chr*_*. Z 10 r subset r-factor

我有一个数据框,df2包含factor按照我想要分组的ID分组的观察结果.我已经使用另一个函数来识别我想要选择的每个因子组中的哪些行.这显示在下面df:

df <- data.frame(ID = c("A","B","C"),
                 pos = c(1,3,2))
df2 <- data.frame(ID = c(rep("A",5), rep("B",5), rep("C",5)),
                  obs = c(1:15))
Run Code Online (Sandbox Code Playgroud)

df,pos对应于我想要在所提到的因子级别内选择的行的索引ID,而不是在整个数据帧中df2.我正在寻找一种方法来ID根据正确的索引为每个行选择行(所以它们的行号在每个因素的水平内df2).

所以,在这个例子中,我要选择的第一个值df2ID == 'A'在第三值df2ID == 'B'和第二个值df2ID == 'C'.

这会给我:

df3 <- data.frame(ID = c("A", "B", "C"),
                  obs = c(1, 8, 12))
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 11

dplyr

library(dplyr)

merge(df,df2) %>% 
  group_by(ID) %>% 
  filter(row_number() == pos) %>%
  select(-pos)

#   ID obs
# 1  A   1
# 2  B   8
# 3  C  12
Run Code Online (Sandbox Code Playgroud)

基地R.

df2m <- merge(df,df2)
do.call(rbind, 
  by(df2m, df2m$ID, function(SD) SD[SD$pos[1], setdiff(names(SD),"pos")]) 
)
Run Code Online (Sandbox Code Playgroud)

by拆分合并的数据帧df2mdf2m$ID和每个部分操作; 它将结果返回到列表中,因此它们必须rbind在最后一起编辑.数据的每个子集(与每个值相关联ID)都使用普通的data.frame语法进行过滤pos和取消选择"pos".

@DavidArenburg在评论中提出的data.table

library(data.table)

setkey(setDT(df2),"ID")[df][, 
  .SD[pos[1L], !"pos", with=FALSE]
, by = ID]
Run Code Online (Sandbox Code Playgroud)

第一部分 - setkey(setDT(df2),"ID")[df]是合并.之后,分割结果表by = ID,并对每个数据子集进行.SD操作.pos[1L]是以正常方式进行子集化,而!"pos", with=FALSE对应于删除pos列.

有关更好的data.table方法,请参阅@ eddi的答案.

  • 也许是`library(data.table); setkey(setDT(df2),"ID")[df] [,.SD [pos [1L]],by = ID]`或类似的东西. (4认同)

use*_*691 9

这是基本的R解决方案:

df2$pos <- ave(df2$obs, df2$ID, FUN=seq_along)
merge(df, df2)
  ID pos obs
1  A   1   1
2  B   3   8
3  C   2  12
Run Code Online (Sandbox Code Playgroud)

如果df2按排序ID,您可以只df2$pos <- sequence(table(df2$ID))为第一行.


edd*_*ddi 7

使用data.table版本1.9.5+:

setDT(df2)[df, .SD[pos], by = .EACHI, on = 'ID']
Run Code Online (Sandbox Code Playgroud)

它合并在ID列上,然后选择pos每行的行df.

  • 或只是`setkey的(setDT(DF2), "ID")[DF,.SD [POS],由= .EACHI]`无devel的版本 (3认同)