R语言 如何计算每一行中给定值出现的次数?

ttisahbt  于 2023-01-22  发布在  其他
关注(0)|答案(4)|浏览(266)

我确信这是一个非常简单的修复方法,但我似乎找不到答案...我试图在 Dataframe 的末尾创建一列,该列是某个特定值(比如“1”)在该行中出现的次数之和。

X1 <- c(5,1,7,8,1,5)
X2 <- c(5,0,0,2,3,7)
X3 <- c(6,2,3,4,1,7)
X4 <- c(1,1,5,2,1,7)

df <- data.frame(id,X1,X2,X3,X4)

  id X1 X2 X3 X4
1  1  5  5  6  1
2  2  1  0  1  1
3  3  7  0  3  5
4  4  8  2  4  2
5  5  1  3  2  1
6  6  5  7  7  7

并且我试图确定值“1”在该行中出现了多少次,我希望输出如下所示:

id X1 X2 X3 X4 one_appears
1  1  5  5  6  1           2
2  2  1  0  1  1           3
3  3  7  0  3  5           0
4  4  8  2  4  2           0
5  5  1  3  2  1           2
6  6  5  7  7  7           0

非常感谢提前!

hc2pp10m

hc2pp10m1#

library(tidyverse)

df %>% 
  mutate(
    one = rowSums(across(everything(), ~ .x == 1))
  )

# A tibble: 6 × 6
     id    X1    X2    X3    X4   one
  <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     5     5     6     1     2
2     2     1     0     2     1     2
3     3     7     0     3     5     0
4     4     8     2     4     2     0
5     5     1     3     1     1     3
6     6     5     7     7     7     0

编辑:

df %>% 
  mutate(
    one = rowSums(across(starts_with("X"), ~ .x == 1))
  )

df %>% 
  mutate(
    one = rowSums(across(X1:X4, ~ .x == 1))
  )
vc9ivgsu

vc9ivgsu2#

我们可以在逻辑矩阵上使用rowSums

df$one_appears <- rowSums(df == 1, na.rm = TRUE)
  • 输出
> df
  id X1 X2 X3 X4 one_appears
1  1  5  5  6  1           2
2  2  1  0  1  1           3
3  3  7  0  3  5           0
4  4  8  2  4  2           0
5  5  1  3  2  1           2
6  6  5  7  7  7           0
cidc1ykv

cidc1ykv3#

applysum一起使用的另一个选项:

id <- c(1:6)
X1 <- c(5,1,7,8,1,5)
X2 <- c(5,0,0,2,3,7)
X3 <- c(6,2,3,4,1,7)
X4 <- c(1,1,5,2,1,7)

df <- data.frame(id,X1,X2,X3,X4)
df$one_appear = apply(df, 1, \(x) sum(x == 1))
df
#>   id X1 X2 X3 X4 one_appear
#> 1  1  5  5  6  1          2
#> 2  2  1  0  2  1          2
#> 3  3  7  0  3  5          0
#> 4  4  8  2  4  2          0
#> 5  5  1  3  1  1          3
#> 6  6  5  7  7  7          0

创建于2023年1月18日,使用reprex v2.0.2

oug3syen

oug3syen4#

这个答案可能不是最好的方法,但一个替代方案,我试图如此认为分享

代码

library(dplyr)

X1 <- c(5,1,7,8,1,5)
X2 <- c(5,0,0,2,3,7)
X3 <- c(6,2,3,4,1,7)
X4 <- c(1,1,5,2,1,7)

df <- data.frame(X1,X2,X3,X4) %>% rowwise %>% 
mutate(across(starts_with('X'), function(x) ifelse(x==1,1,NA), .names = 'Y_{col}'), 
                                         one_appears=sum(across(starts_with('Y')), na.rm = T)
                                         )

相关问题