[英]Subsetting a dataframe conditionally by comparing it with a different nrow dataframe
我正在嘗試提取 dataframe 的行,這些行顯示了一些常見數據以及不同大小的行 dataframe:
df1:
A B C D
a t 4 9
s p 3 7
w d 1 10
df2:
A B C D
a t 3 7
m r 5 8
p m 1 3
g u 5 2
s p 2 6
我試圖讓 df1 的行完成這個條件: 1.兩個數據幀之間的 A 和 B 變量必須相等 2. df1$C 必須屬於區間(df2$C -5,df2$C +5),所以兩個值之差的絕對值必須小於 5。
new_df<-df1[df1$A == df2$A && df1$B == df2$B && (df1$C > (df2$C - 5) && df1$C < (df2$C + 5)), ]
但我收到此錯誤,因為兩個數據幀的行數不同:
longer object length is not a multiple of shorter object length
我也嘗試過使用which
但我得到了同樣的錯誤。 我該如何解決這個問題?
我預期的 output 將是:
new_df
A B C D
a t 4 9
s p 3 7
這可能是一種方式(這里故意做更多的中間變量,可以縮短)。 我的邏輯是A
和B
匹配可用於連接 df(步驟 1 - 產生數據幀s1
),然后進一步過濾數字條件(步驟 2 - 產生數據幀s2
):
df1 <- tibble::tribble(
~A, ~B, ~C, ~D,
"a", "t", 4, 9,
"s", "p" , 3, 7,
"w", "d", 1, 10
)
df2 <- tibble::tribble(
~A, ~B, ~C, ~D,
"a", "t", 3 , 7,
"m", "r", 5, 8,
"p", "m", 1 , 3,
"g", "u", 5, 2,
"s", "p", 2 , 6)
new_df<-df1[df1$A == df2$A && df1$B == df2$B && (df1$C > (df2$C - 5) && df1$C < (df2$C + 5)), ]
s1 <- inner_join(df1, df2, by = (c("A", "B")), suffix = c(".from1", ".from2"))
s2 <- s1 %>%
mutate(condition1 = C.from1 > C.from2 - 5,
condition2 = C.from1 < C.from2 + 5) %>%
filter(condition1, condition2) %>%
select(-starts_with("condition"))
這是一個基本的 R 解決方案:
通過A和B合並 2 個 DF,確保這些變量已經匹配並將其分配給新的 DF。 在這個新的 DF 中,應用剩余的 2 個條件並刪除來自合並的最后兩列。
df1 <- tibble::tribble(
~A, ~B, ~C, ~D,
"a", "t", 4, 9,
"s", "p" , 3, 7,
"w", "d", 1, 10
)
df2 <- tibble::tribble(
~A, ~B, ~C, ~D,
"a", "t", 3 , 7,
"m", "r", 5, 8,
"p", "m", 1 , 3,
"g", "u", 5, 2,
"s", "p", 2 , 6)
merge(df1, df2, by = c('A', 'B')) -> df3
df3[(df3$C.x > df3$C.y-5) && df3$C.x < (df3$C.y + 5),][,-c(5,6)]
#> A B C.x D.x
#> 1 a t 4 9
#> 2 s p 3 7
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.