簡體   English   中英

按條件 (>) 計算每行的列數

[英]Count number of columns by a condition (>) for each row

我正在嘗試為矩陣的每一行計算出有多少列的值大於指定值。 很抱歉我問了這個簡單的問題,但我無法弄清楚。

對於我感興趣的一些空間點,我已經從多年柵格的柵格堆棧中提取了最高溫度值。數據看起來類似於:

data <- cbind('1990' = c(25, 22, 35, 42, 44), '1991' = c(23, 28, 33, 40, 45), '1992' = c(20, 20, 30, 41, 43))

    1990   1991   1992
1     25     23     20
2     22     28     20
3     35     33     30
4     42     40     41
5     44     45     43

我想以每個位置的溫度高於 30 的年數結束,例如:

    yr.above   
1          0
2          0
3          2
4          3
5          3

我嘗試了一些東西,但它們沒有用,而且非常不合邏輯(例如嘗試 length(data[1:length(data), which(blah blah don't sense)),或 apply(data, 1, length (數據)> 30),我知道這些沒有意義,但我有點卡住了。

這將為您提供您正在尋找的向量:

rowSums(data > 30)

無論data是矩陣還是data.frame,它都會起作用。 此外,它使用矢量化函數,因此是使用apply的首選方法,它只不過是一個(慢)for 循環。

如果data是 data.frame,您可以通過執行以下操作將結果添加為列:

data$yr.above <- rowSums(data > 30)

或者如果data是矩陣:

data <- cbind(data, yr.above = rowSums(data > 30))

您還可以創建一個全新的 data.frame:

data.frame(yr.above = rowSums(data > 30))

或一個全新的矩陣:

cbind(yr.above = rowSums(data > 30))

apply 的第三個參數需要是一個函數。 此外,您可以使用 sum 計算邏輯真值。

apply(data, 1, function(x)sum(x > 30))

我們也可以使用Reduce+ (假設沒有 NA 元素)

 Reduce(`+`, lapply(as.data.frame(data), `>`, 30))

這應該是有效的,因為我們沒有轉換為matrix

使用dplyr包,您可以嘗試以下兩種解決方案。

library(dplyr)
df <- as.data.frame(data)

選項 1

df %>%
  mutate(yr.above = rowSums(select(df, `1990`:`1992`) > 30))

選項 2

dplyr 1.0.0 ,您可以將c_across()rowwise()一起使用,以便輕松執行按聚合。

df %>%
  rowwise() %>%
  mutate(yr.above = sum(c_across(`1990`:`1992`) > 30)) %>%
  ungroup()

注意:使用dplyr的好處dplyr是支持tidy selections它提供了一種簡潔的 R 方言,用於根據變量的名稱或屬性選擇變量。


輸出

# # A tibble: 5 x 4
#   `1990` `1991` `1992` yr.above
#    <dbl>  <dbl>  <dbl>    <int>
# 1     25     23     20        0
# 2     22     28     20        0
# 3     35     33     30        2
# 4     42     40     41        3
# 5     44     45     43        3

暫無
暫無

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

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