R语言 如何计算数据框中多个列中的特定值和最大值?

1bqhqjot  于 2023-07-31  发布在  其他
关注(0)|答案(4)|浏览(107)

我想计算ACE变量集合中有多少个值在3到15之间,并将它们放入一个新变量(newVar)中。
此外,我需要知道这些变量之间的最大值是多少,并将其放入一个新的列(maxVar)中。
注意:在真实的数据库中,变量的名称不遵循模式,我需要一个接一个地指定。
| varA| varB| varC| vardD|变异E|newVar|maxVar|maxVar|
| --|--|--|--|--|--|--| ------------ |
| 三个|五|七|十二岁|二个|二个|七| 7 |
| 四|八|三个|七|四|三个|四| 4 |
| 六|九|1| 0|十一|二个|十一| 11 |
| 八|七|七|四|二个|二个|八| 8 |
| 0|三个|0|二个|1| 0| 1| 1 |
| 三个|七|十五岁|九|十一|三个|十五岁| 15 |
在Stata中,可以使用以下命令来执行:
egen newVar = anycount (varA varC varE), values (3/15)
egen maxVar = rowmax (varA varC varE)
我怎么能在R中做同样的事情呢?

ar7v8xwq

ar7v8xwq1#

这个在R基中是怎么回事:

rowSums(((df >= 3) * (df <= 15))[, grepl("[ACE]$", colnames(df))])
#> [1] 2 3 2 2 0 3

字符串
编辑
不好看,但很管用

df |>
  (\(x) list(
      x = x,
      rowSums(((x >= 3) * (x <= 15))[, c("varA", "varC", "varE")]),
      apply(x[, c("varA", "varC", "varE")], 1, max)
    ))() |>

  (\(x) Reduce(cbind, x) |>
     `colnames<-`(c(colnames(df), c("newVar", "maxVar"))))()
#>   id varA varB varC varD varE newVar maxVar
#> 1  1    3    5    7   12    2      2      7
#> 2  2    4    8    3    7    4      3      4
#> 3  3    6    9    1    0   11      2     11
#> 4  4    8    7    7    4    2      2      8
#> 5  5    0    3    0    2    1      0      1
#> 6  6    3    7   15    9   11      3     15

xytpbqjk

xytpbqjk2#

你可以试试

df %>%
    mutate(newVar = rowSums(between(select(., ends_with(c("A", "C", "E"))), 3, 15)))

字符串

df %>%
    mutate(newVar = rowSums(between(select(., matches("[ACE]$")), 3, 15)))


这给了

id varA varB varC varD varE newVar
1  1    3    5    7   12    2      2
2  2    4    8    3    7    4      3
3  3    6    9    1    0   11      2
4  4    8    7    7    4    2      2
5  5    0    3    0    2    1      0
6  6    3    7   15    9   11      3

lskq00tm

lskq00tm3#

或者使用lengthwhich

library(tidyverse)

df %>% rowwise() %>% rowwise() %>% 
  mutate(newvar=length(which(across(c(varA,varC,varE)) %in% c(3:15))))

字符串
创建于2023-07-15带有reprex v2.0.2

# A tibble: 6 × 7
# Rowwise: 
     id  varA  varB  varC  varD  varE newvar
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <int>
1     1     3     5     7    12     2      2
2     2     4     8     3     7     4      3
3     3     6     9     1     0    11      2
4     4     8     7     7     4     2      2
5     5     0     3     0     2     1      0
6     6     3     7    15     9    11      3

iyfamqjs

iyfamqjs4#

你可以用

library(dplyr)

df |> rowwise() |>
    mutate(newVar = sum(between(c_across(c(varA, varC, varE)), 3, 15))) |>
    mutate(maxVar = max(c_across(c(varA, varC, varE)))) |> 
    ungroup()

# A tibble: 6 × 8
     id  varA  varB  varC  varD  varE newVar maxVar
  <int> <int> <int> <int> <int> <int>  <int>  <int>
1     1     3     5     7    12     2      2      7
2     2     4     8     3     7     4      3      4
3     3     6     9     1     0    11      2     11
4     4     8     7     7     4     2      2      8
5     5     0     3     0     2     1      0      1
6     6     3     7    15     9    11      3     15

字符串
使用的数据:

> dput(df)

structure(list(id = 1:6, varA = c(3L, 4L, 6L, 8L, 0L, 3L), varB = c(5L, 
8L, 9L, 7L, 3L, 7L), varC = c(7L, 3L, 1L, 7L, 0L, 15L), varD = c(12L, 
7L, 0L, 4L, 2L, 9L), varE = c(2L, 4L, 11L, 2L, 1L, 11L), newVar = c(2L, 
3L, 1L, 2L, 0L, 3L)), row.names = c(NA, -6L), class = c("data.table", 
"data.frame"))

相关问题