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