R 每个组的子集特定行

R 每个组的子集特定行,r,subset,slice,apply,R,Subset,Slice,Apply,我有这样一个数据帧: Group V2 V3 V4 1 D F W 1 T A L 1 P F P 2 T F L 2 R R O 2 D Y L 2 D F I ...

我有这样一个数据帧:

    Group     V2   V3   V4
      1        D    F    W 
      1        T    A    L 
      1        P    F    P 
      2        T    F    L 
      2        R    R    O 
      2        D    Y    L 
      2        D    F    I 
      ...     
 [1]  1 3
 [2]  4
 [3]  2 3 4
我的清单如下:

    Group     V2   V3   V4
      1        D    F    W 
      1        T    A    L 
      1        P    F    P 
      2        T    F    L 
      2        R    R    O 
      2        D    Y    L 
      2        D    F    I 
      ...     
 [1]  1 3
 [2]  4
 [3]  2 3 4
列表中的每个元素都指示我要为每个组保留哪一行。所以我只想在数据帧中保持Group==1的第1行和第3行;第四排为第二组;第3组的第2行、第3行和第4行等

我已经尽力了,但我还没有找到一个简单的方法,尽管我很确定一定有一个方法使用apply或类似的东西

你能做到

do.call(rbind, Map(function(x, y) x[y,], split(df, df$Group), l1))
#    Group V2 V3 V4
#1.1     1  D  F  W
#1.3     1  P  F  P
#2       2  D  F  I
在哪里,

l1 <- list(c(1, 3), 4)
l1你可以做

do.call(rbind, Map(function(x, y) x[y,], split(df, df$Group), l1))
#    Group V2 V3 V4
#1.1     1  D  F  W
#1.3     1  P  F  P
#2       2  D  F  I
在哪里,

l1 <- list(c(1, 3), 4)

l1与您的类似,具有以下要处理的对象、data.frame和列表:

df <- read.table(text = "Group     V2   V3   V4
      1        D    F    W 
      1        T    A    L 
      1        P    F    P 
      2        T    F    L 
      2        R    R    O 
      2        D    Y    L 
      2        D    F    I
      3        E    F    I
      3        F    F    I
      3        G    F    I
      3        T    F    I", header = T)
l <- list(c(1, 3), 4, c(2:4))

do.call(rbind, lapply(seq_along(l), function(i) df[df$Group == i,][l[[i]],]))
#   Group V2 V3 V4
#1      1  D  F  W
#3      1  P  F  P
#7      2  D  F  I
#9      3  F  F  I
#10     3  G  F  I
#11     3  T  F  I

与您的类似,具有以下要处理的对象、data.frame和列表:

df <- read.table(text = "Group     V2   V3   V4
      1        D    F    W 
      1        T    A    L 
      1        P    F    P 
      2        T    F    L 
      2        R    R    O 
      2        D    Y    L 
      2        D    F    I
      3        E    F    I
      3        F    F    I
      3        G    F    I
      3        T    F    I", header = T)
l <- list(c(1, 3), 4, c(2:4))

do.call(rbind, lapply(seq_along(l), function(i) df[df$Group == i,][l[[i]],]))
#   Group V2 V3 V4
#1      1  D  F  W
#3      1  P  F  P
#7      2  D  F  I
#9      3  F  F  I
#10     3  G  F  I
#11     3  T  F  I

使用
tidyverse

library(tidyverse)
df %>% 
   group_split(Group) %>% 
   map2_df(l, ~ .x %>% 
                  slice(.y))
# A tibble: 6 x 4
#  Group V2    V3    V4   
#  <int> <fct> <fct> <fct>
#1     1 D     F     W    
#2     1 P     F     P    
#3     2 D     F     I    
#4     3 F     F     I    
#5     3 G     F     I    
#6     3 T     F     I    
库(tidyverse)
df%>%
分组(分组)%>%
map2_df(l,~.x%>%
切片(.y))
#一个tibble:6x4
#组V2 V3 V4
#     
#1维F W
#2 1 P F P
#3 2 D F I
#4 3 F I
#5.3 G F I
#6T3TFI
数据
df使用
tidyverse的选项

library(tidyverse)
df %>% 
   group_split(Group) %>% 
   map2_df(l, ~ .x %>% 
                  slice(.y))
# A tibble: 6 x 4
#  Group V2    V3    V4   
#  <int> <fct> <fct> <fct>
#1     1 D     F     W    
#2     1 P     F     P    
#3     2 D     F     I    
#4     3 F     F     I    
#5     3 G     F     I    
#6     3 T     F     I    
库(tidyverse)
df%>%
分组(分组)%>%
map2_df(l,~.x%>%
切片(.y))
#一个tibble:6x4
#组V2 V3 V4
#     
#1维F W
#2 1 P F P
#3 2 D F I
#4 3 F I
#5.3 G F I
#6T3TFI
数据
df