簡體   English   中英

通過將 dataframe 與不同的 nrow dataframe 進行比較,有條件地對 dataframe 進行子集化

[英]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

這可能是一種方式(這里故意做更多的中間變量,可以縮短)。 我的邏輯是AB匹配可用於連接 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 解決方案:

通過AB合並 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM