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).
所以,在这个例子中,我要选择的第一个值df2与ID == 'A'在第三值df2与ID == 'B'和第二个值df2用ID == '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拆分合并的数据帧df2m由df2m$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的答案.
这是基本的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))为第一行.
使用data.table版本1.9.5+:
setDT(df2)[df, .SD[pos], by = .EACHI, on = 'ID']
Run Code Online (Sandbox Code Playgroud)
它合并在ID列上,然后选择pos每行的行df.