[英]How do I use the across function across all columns of a dataframe rather than specify certain columns?
[英]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列結構相同,然后再進行比較的列數相同,則可以使用任意數量的變量進行比較。 我將逐步介紹該方法。
paint2
到正確的價值觀c1a
,並返回TRUE
或FALSE
。 因此,我們使用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
然后,我們要比較每行只有返回TRUE
如果每一個為TRUE
。 因此,我們首先必須transpose()
,以便每個元素都是行而不是列。
然后,我們要檢查所有行以查看它們是否都為TRUE
,因此我們使用all
映射行。 unlist
列出該列表只是為了避免警告您在列表而不是向量上使用all
列表。 這給了我們:
paint2
每行一個值
[1] TRUE FALSE FALSE TRUE FALSE
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創建。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.