我是一名使用R的行为生态学家。我正在尝试计算几列中的非零元素。通常,当我这样做的时候,我已经成功地使用了colSums和=0运算符,正如在这里和其他地方的许多帖子中所建议的那样,即(计算每列的非零元素的数量(。
然而,在这种特殊的情况下,我真的更喜欢使用管道——因为这只是构建更大数据帧的一步——而且我似乎无法使用=0可以很好地演奏滚边。有没有办法做到这一点,或者有没有一种更优雅的方法来计算生活在整洁诗句中的列中的非零值?
我在下面放了一些示例代码来演示。非常感谢!
''
#make example dataframe
example<- as.data.frame(matrix(sample(c(0,0,0,100),size=70,replace=T),ncol=7))
example<-cbind(Indentifier1="character a",Indentifier2="character b", example)
example
#works great but isn't piping friendly:
colSums(example[-c(1:2)] !=0)
#Runs but because it lacks the !=0 operator it gives sums not counts of non-zero elements, can't figure out how to employ !=0:
example %>% select(-c(1:2)) %>% colSums()
#gives me counts of all values, not sure how to call just non-zero values:
example %>% summarise(across(where(is.numeric), length))
''
example %>% summarise(across(where(is.numeric), ~sum(. != 0)))
如果您想完全采用magrittr
,请阅读有关?alias
的内容。
library(magrittr)
example %>%
extract(-c(1, 2)) %>%
equals(0) %>%
not() %>%
colSums()
# V1 V2 V3 V4 V5 V6 V7
# 2 3 1 4 3 4 1
数据
set.seed(42)
example<- as.data.frame(matrix(sample(c(0,0,0,100),size=70,replace=T),ncol=7))
example<-cbind(Indentifier1="character a",Indentifier2="character b", example)
example
#works great but isn't piping friendly:
colSums(example[-c(1:2)] !=0)
# V1 V2 V3 V4 V5 V6 V7
# 2 3 1 4 3 4 1
获取要计算的逻辑矩阵,并将其管道传输到colSums()
(example |> select(-(1:2)) != 0) |>
colSums()
当然,这是很棘手的,因为它依赖于隐含的操作顺序规则,该规则迫使example |> select(-(1:2))
在与0进行比较之前进行求值,以及使用()
进行显式分组以在管道连接到colSums()
之前求值不等式。
您仍然可以使用带有基本R代码的管道。例如,你可以这样做:
example %>%
.[-c(1:2)] %>%
replace(., . != 0, 1) %>%
colSums()
#V1 V2 V3 V4 V5 V6 V7
# 2 3 1 2 4 1 1
只需使用基数R(>=4.1(就可以进行
example |>
subset(select=-(1:2)) |>
{(.) colSums(. != 0)}()
# V1 V2 V3 V4 V5 V6 V7
# 4 4 3 3 3 2 2