首页 > 解决方案 > 如何使用 R 中的其他两个数据框对数据进行子集化

问题描述

我有一个 ID 为 (100) 的数据框,每个 ID 的行数不同,所有 ID 的列数相同。

示例数据框如下所示

a <- data.frame(ID = c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2), 
              A = c(12,12.5,15,16,18,20,25,26,29,35, 12,12.5,15,16,18,20,25,26,29,35),
              B = c(20,19,18,17,16,20,25,28,30,35, 20,19,18,17,16,20,25,28,30,35),
              C = c(2,1,5,9,10,11,13,18,25,27,2,1,5,9,10,11,13,18,25,27))

在每个 ID 中,我想对两个指定值之间的数据进行子集化,这两个值分别位于另外两个数据帧中。

第一个值是每个 ID 的第一行,示例数据帧如下

 b <- data.frame(ID = c(1,2), 
              A = c(12.0,12.0),
              B = c(20,20),
              C = c(2,2))

第二个值是基于向量中某个值的指定行,示例数据帧如下

c <- data.frame(ID = c(1,2), 
               A = c(25.0,20.0),
               B = c(25,20),
               C = c(13,11))

如果我们可以观察到,对应于每个 ID 的行,其值与主数据框“a”中的值相同

预期的数据框如下

d <- data.frame(ID = c(1,1,1,1,1,1,1,2,2,2,2,2,2), 
              A = c(12,12.5,15,16,18,20,25, 12,12.5,15,16,18,20),
              B = c(20,19,18,17,16,20,25, 20,19,18,17,16,20),
              C = c(2,1,5,9,10,11,13,2,1,5,9,10,11))

为了获得预期的输出,我尝试了以下代码.....但失败了

for (i in 1:nrow(b)){
Azimuth[i] = (a[which(a$A == b$A[i]):which(a$A == c$A[i])])
}

在这里,我尝试使用两个数据帧“b”和“c”来对“a”中的数据进行子集化。但是是否有可能在不使用数据帧'b'的情况下获得相同的输出?!因为在数据框“b”中,每一行都是数据框“a”中每个 ID 的第一行

标签: rdataframedata-manipulation

解决方案


一个dplyr解决方案

library(dplyr)
a %>% 
  mutate(end = FALSE) %>% 
  rows_update(c %>% mutate(end = TRUE), by = c("ID", "A", "B", "C")) %>% 
  group_by(ID) %>% 
  slice(1:which(end)) %>% 
  select(-end)

输出:

# A tibble: 13 x 4
# Groups:   ID [2]
      ID     A     B     C
   <dbl> <dbl> <dbl> <dbl>
 1     1  12      20     2
 2     1  12.5    19     1
 3     1  15      18     5
 4     1  16      17     9
 5     1  18      16    10
 6     1  20      20    11
 7     1  25      25    13
 8     2  12      20     2
 9     2  12.5    19     1
10     2  15      18     5
11     2  16      17     9
12     2  18      16    10
13     2  20      20    11

解释:

我想您想使用一个数据框来对另一个数据框进行子集化,因为您只想在a存在您在数据框中指定的ID、、和的某些组合时才进行子集化?ABCc

如果是这种情况,您可以通过以下步骤来实现您的目标:

  1. 我们在 中创建另一个逻辑变量a。调用它end并默认为FALSE.
  2. 我们还创建了相同的变量,c但将其默认设置为TRUE.
  3. 我们使用endinc来更新由、和的组合标记的每一行的endin 。这样,只有当其他四个变量之间完全匹配时,该变量才会变为。如果你找不到完整的匹配,那么你会得到这个 aIDABCendTRUEacError: Attempting to update missing rows.
  4. 我们group_by(ID)从第一行中选择,直到end TRUE定义的每个组的位置ID
  5. 您删除该end变量,因为它不再使用。

推荐阅读