簡體   English   中英

如何跨數據框列創建具有多個if條件的循環?

[英]How do I create a loop with multiple if criteria across dataframe columns?

我有一個帶有幾個列變量和大約10行復制的數據框,還有一個帶有相同變量但有700行的數據框。 我想創建一個循環,以獲取第二個數據幀中該行的每個值,並查看它是否在第一個數據幀的相應列的范圍內。 到目前為止,我已經嘗試了一個很長一段時間的for loop有很多語法錯誤,以至於我無法確定從哪里開始修復它。

這是我的數據框的簡化版。 數據框1:c1a

WAV    UV     VIOLET    BLUE
2D1    10.8   10.1      23.5
3A4    6.2    8.2       19.9
4A1    8.3    11.7      28.6
5C2    7.9    8.2       31.0
5C3    10.7   9.5       18.1

數據框2:paint2

ID    UV     VIOLET    BLUE
D1    7.9    10.1      19.3
D2    7.0    9.2      15.9
D3    21.4   20.7      27.4
D4    10.3   8.9      20.9
D5    21.7   16.5      21.3

因此,我要查看的是D1的每個值是否都落在數據幀1的相應列的范圍內,以此類推,然后針對每一行,等等,然后獲取所有列都已成功完成ID的輸出。

我的代碼:

c1a.out=NULL

for (i in nrow(paint2)){
  if (min(c1a[,2]) < [i,2] < max(c1a[,2])
  && min(c1a[,3]) < [i,3] < max(c1a[,3])
  && min(c1a[,4]) < [i,4] < max(c1a[,4])){
  c1a.out=c(c1a.out, [i,1])
  }
}     

輸出將只是其ID名稱的值落入第一個數據幀中整個COLUMN范圍的列表。

>c1a.out
>D1  D4

例如,D2之所以沒有列出該列表,是因為D2的BLUE值不在c1a中的BLUE值范圍內,即使它的UV和VIOLET值在c1a中其相應列的范圍內。

我知道這很丑陋,我對制作循環一無所知。 如果我收到的錯誤有更正(意外的方括號和逗號),或者可以創建的循環的更簡單,更優雅的版本,我將不勝枚舉。

好的,這是一個tidyverse解決方案,但可能比我想要的要復雜得多-顯然比for循環更容易閱讀。 但是,假定所有表的ID列結構相同,然后再進行比較的列數相同,則可以使用任意數量的變量進行比較。 我將逐步介紹該方法。

  1. 我們想要做的是每個值在比較paint2到正確的價值觀c1a ,並返回TRUEFALSE 因此,我們使用map2來映射paint2除第一個( .x = .[, -1] )和c1a的右索引( .y = 2:ncol(.) )以外的各列。 我們可以這樣做是因為數據框只是列的列表! 這樣整個map2行會創建一個新列表,其中每個變量列均包含元素,每個元素都包含正確的邏輯值。 像這樣:

paint2每個單元格一個值paint2

$UV
[1]  TRUE  TRUE FALSE  TRUE FALSE

$VIOLET
[1]  TRUE  TRUE FALSE  TRUE FALSE

$BLUE
[1]  TRUE FALSE  TRUE  TRUE  TRUE
  1. 然后,我們要比較每行只有返回TRUE如果每一個為TRUE 因此,我們首先必須transpose() ,以便每個元素都是行而不是列。

  2. 然后,我們要檢查所有行以查看它們是否都為TRUE ,因此我們使用all映射行。 unlist列出該列表只是為了避免警告您在列表而不是向量上使用all列表。 這給了我們:

paint2每行一個值

[1]  TRUE FALSE FALSE  TRUE FALSE
  1. 最后,我們只是用which來獲取是指數TRUE ,並打印出的那些值ID
library(tidyverse)
c1a <- read_table2(
  "WAV    UV     VIOLET    BLUE
  D1    10.8   10.1      23.5
  A4    6.2    8.2       19.9
  A1    8.3    11.7      28.6
  C2    7.9    8.2       31.0
  C3    10.7   9.5       18.1"
)

paint2 <- read_table2(
  "ID    UV     VIOLET    BLUE
  D1    7.9    10.1      19.3
  D2    7.0    9.2      15.9
  D3    21.4   20.7      27.4
  D4    10.3   8.9      20.9
  D5    21.7   16.5      21.3"
)

indices <- paint2 %>% map2(
  .x = .[, -1],
  .y = 2:ncol(.),
  .f = ~ between(.x, min(c1a[, .y]), max(c1a[, .y]))
) %>%
  transpose() %>%
  map_lgl(~ all(unlist(., use.names = FALSE))) %>%
  which()

paint2$ID[indices]
#> [1] "D1" "D4"

reprex軟件包 (v0.2.0)於2018-03-15創建。

為了進一步閱讀, 這是有關purrr 的出色教程 ,並使用它來映射對象,並盡可能避免for循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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