gpt4 book ai didi

r - 选择具有特定列匹配条件的行

转载 作者:行者123 更新时间:2023-12-04 07:31:05 24 4
gpt4 key购买 nike

我有一个 data.frame有 2291 行和 4 列,我想选择那些第 3 列与下一行的第 2 列匹配的行,然后从下一个匹配的行重新开始,直到匹配继续进行,直到它停止。

我尝试使用 for来自 1:nrow(df) 的循环,但这并不像 i 那样准确(我认为)并没有真正从匹配的行开始。

我目前的代码是这样的:

test <- NULL 
x <- c()
y <- c()

for(i in 1:nrow(df)){
if(df[i,3]==df[i+1,2]){
x <- df[i,]
y <- df[i+1,]
i = i+1 #stuck at this
}
test <- rbind(test,x,y)
}

示例数据如下所示:
X  2670000  3750000    C
X 3830000 8680000 E3
X 8680000 10120000 E1-A
X 10120000 11130079 D
X 11170079 11810079 E3
X 11810079 12810079 E2-A
X 12810079 13530079 E3
X 13530079 14050079 E3
X 14050079 15330079 A
X 15330079 16810079 E2-A
X 16810079 17690079 E2-A

我想要的是:
X  3830000  8680000   E3
X 8680000 10120000 E1-A
X 10120000 11130079 D

X 11170079 11810079 E3
X 11810079 12810079 E2-A
X 12810079 13530079 E3
X 13530079 14050079 E3
X 14050079 15330079 A
X 15330079 16810079 E2-A
X 16810079 17690079 E2-A

我实际上对第 4 列的值感兴趣。在这样的条件下,当 df[i,3]不等于 df[i+1,2] ,是否可以更新代码以将第 4 列的值存储在向量中?

例如: 此示例的结果将是:
vector_1
"E3" "E1-A" "D"

vector_2
"E3" "E2-A" "E3" "E3" "A" "E2-A" "E2-A"

到目前为止我得到的是:
X  3830000  8680000   E3
X 8680000 10120000 E1-A
X 8680000 10120000 E1-A
X 10120000 11130079 D
X 8680000 10120000 E1-A
X 10120000 11130079 D
X 11170079 11810079 E3
X 11810079 12810079 E2-A
X 11810079 12810079 E2-A
X 12810079 13530079 E3

如果我从第 1 行到我的 df 的最后一行,我想继续在向量中添加第 4 列的值,只要 i 的第 3 列匹配 i+1 的第 2 列.一旦该条件中断,下次满足相同条件时,我想再次继续存储第 4 列的值。

谢谢!

最佳答案

一个简单的方法是使用 lead dplyr 包中的函数。

lead(x, n = 1L, default = NA, order_by = NULL, ...) Find the "next" or "previous" values in a vector. Useful for comparing values ahead of or behind the current values.



这也使您可以完全避免 for 循环。由于您没有在问题中命名您的列,我将使用另一个示例:

library(dplyr)
df <- data.frame(a = 1:5, b = c(2, 999, 4, 5, 999))

print(df) # In this example, we want to keep the 1st, 3rd, and 4th rows.
a b
1 1 2
2 2 999
3 3 4
4 4 5
5 5 999

matching_df <- df[df$b == dplyr::lead(df$a, 1, default = FALSE), ]
print(matching_df)
a b
1 1 2
3 3 4
4 4 5

non_matching_df <- df[df$b != dplyr::lead(df$a, 1, default = FALSE), ]
print(non_matching_df)
a b
2 2 999
5 5 999

关于r - 选择具有特定列匹配条件的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54078164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com