r - 如何使用 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 的第一行
解决方案
一个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
、、和的某些组合时才进行子集化?A
B
C
c
如果是这种情况,您可以通过以下步骤来实现您的目标:
- 我们在 中创建另一个逻辑变量
a
。调用它end
并默认为FALSE
. - 我们还创建了相同的变量,
c
但将其默认设置为TRUE
. - 我们使用
end
inc
来更新由、和的组合标记的每一行的end
in 。这样,只有当其他四个变量之间完全匹配时,该变量才会变为。如果你找不到完整的匹配,那么你会得到这个a
ID
A
B
C
end
TRUE
a
c
Error: Attempting to update missing rows.
- 我们
group_by(ID)
从第一行中选择,直到end
由TRUE
定义的每个组的位置ID
。 - 您删除该
end
变量,因为它不再使用。
推荐阅读
- docker - Rexray 插件无法访问 EBS 卷并创建新卷
- python - 如何在单元格中删除包含“未命名”的python行?
- svelte - 苗条:应用程序/ld+json
- javascript - 单击复选框时如何设置标签标签的样式?
- c++ - 为什么在我的程序中输入另一个输入会给我不同的结果?
- android - 许可应用程序 android 解锁有用
- android - Android 应用程序在 OneSignal 推送通知上崩溃
- ruby-on-rails - 载波重新创建版本!损坏原始图像
- python-3.x - 无法在 Python 中重新启动 While 循环
- php - 错误:在 c 面板上使用密码 yes 拒绝用户“@localhost”访问