R:根据其他名称相似的变量的选择条件创建多个新变量

马力

我有一个数据框,其中每个条件(在示例中:希望,梦想,喜悦)都有5个变量(在示例中,后缀x,y,z,a,b编码-每个条件都相同)。

df <- data.frame(matrix(1:16,5,16))
names(df) <- c('ID','hopex','hopey','hopez','hopea','hopeb','dreamx','dreamy','dreamz','dreama','dreamb','joyx','joyy','joyz','joya','joyb')
df[1,2:6] <- NA
df[3:5,c(7,10,14)] <- NA

数据如下所示:

ID hopex hopey hopez hopea hopeb dreamx dreamy dreamz dreama dreamb joyx joyy joyz joya joyb
1  1    NA    NA    NA    NA    NA     15      4      9     14      3    8   13    2    7   12
2  2     7    12     1     6    11     16      5     10     15      4    9   14    3    8   13
3  3     8    13     2     7    12     NA      6     11     NA      5   10   15   NA    9   14
4  4     9    14     3     8    13     NA      7     12     NA      6   11   16   NA   10   15
5  5    10    15     4     9    14     NA      8     13     NA      7   12    1   NA   11   16

我想为每个条件(希望,梦想,喜乐)创建一个新变量,该变量编码该条件的所有变量x ... b是否都为NA(如果全部为NA,则为0,如果全部为非NA,则为1)。我希望将新变量存储在数据框中。因此,输出应为:

  ID hopex hopey hopez hopea hopeb dreamx dreamy dreamz dreama dreamb joyx joyy joyz joya joyb hope joy dream
1  1    NA    NA    NA    NA    NA     15      4      9     14      3    8   13    2    7   12    0   1     1
2  2     7    12     1     6    11     16      5     10     15      4    9   14    3    8   13    1   1     1
3  3     8    13     2     7    12     NA      6     11     NA      5   10   15   NA    9   14    1   1     1
4  4     9    14     3     8    13     NA      7     12     NA      6   11   16   NA   10   15    1   1     1
5  5    10    15     4     9    14     NA      8     13     NA      7   12    1   NA   11   16    1   1     1

下面的代码可以做到这一点,但是我正在寻找一个更优雅的解决方案(例如,在我有更多条件的情况下)。我尝试了all(),select(),mutate()的各种组合,但是尽管它们看起来都很有用,但我无法弄清楚如何将它们组合起来以获得我想要的东西。我被困住了,对学习更有效的编码感兴趣。提前致谢!

df$hope <- 0
df[is.na(df$hopex) == FALSE | is.na(df$hopey) == FALSE | is.na(df$hopez) == FALSE | is.na(df$hopea) == FALSE | is.na(df$hopeb) == FALSE, "hope"] <- 1

df$dream <- 0
df[is.na(df$dreamx) == FALSE | is.na(df$dreamy) == FALSE | is.na(df$dreamz) == FALSE | is.na(df$dreama) == FALSE | is.na(df$dreamb) == FALSE, "dream"] <- 1

df$joy<- 0
df[is.na(df$joyx) == FALSE | is.na(df$joyy) == FALSE | is.na(df$joyz) == FALSE | is.na(df$joya) == FALSE | is.na(df$joyb) == FALSE, "joy"] <- 1
阿克伦

这是一个选择 tidyverse

library(dplyr)
library(purrr)
library(magrittr)
df %>%
   mutate(hope = select(., starts_with('hope')) %>% 
                is.na %>%
                 `!` %>% 
                 rowSums %>% 
                 is_greater_than(0) %>% 
                 as.integer)
#   hopex hopey hopez hopea hopeb dreamx dreamy dreamz dreama dreamb joyx joyy joyz joya joyb hope
#1    NA    NA    NA    NA    NA     NA     NA     NA     NA     NA   NA   NA   NA   NA   NA    0
#2     1     1     4     3     2      3      5      4      5      2    5   NA    4    3    1    1
#3     2    NA     4     4     4      3      5     NA      5      5    4   NA    4    5    1    1
#4     4     3    NA     1     1      1      5      2     NA      5    1    2    1    1    1    1
#5     1    NA     4    NA    NA      2      1      5      1      2   NA    3    1    2    5    1

或搭配 rowSums

df %>%
     mutate(hope = +(rowSums(!is.na(select(., starts_with('hope'))))!= 0))

对于多列,我们可以创建一个函数

f1 <- function(dat, colSubstr) {
         dplyr::select(dat, starts_with(colSubstr)) %>%
                is.na %>%
                 `!` %>%                     
                 rowSums %>%
                 is_greater_than(0) %>% 
                 as.integer 
   }

df %>%
      mutate(hope = f1(., 'hope'),
             dream = f1(., 'dream'),
             joy = f1(., 'joy'))

或使用 base R

cbind(df, sapply(split.default(df, sub(".$", "", names(df))), 
             function(x) +(rowSums(!is.na(x)) != 0)))

如果我们想对列进行子集

nm1 <- setdiff(names(df), "ID")
cbind(df, sapply(split.default(df[nm1], sub(".$", "", names(df[nm1]))),
        function(x) +(rowSums(!is.na(x)) != 0)))

数据

set.seed(24)
df <- as.data.frame(matrix(sample(c(NA, 1:5), 5 * 15, replace = TRUE),
    ncol = 15, dimnames = list(NULL, paste0(rep(c("hope", "dream", "joy"), 
   each = 5), c('x', 'y', 'z', 'a', 'b')))))
df[1,] <- NA

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

R:如何根据其他列的名称创建新变量

来自分类Dev

awk 根据其他列的条件创建新变量

来自分类Dev

R-对名称相似的多个变量使用rbind

来自分类Dev

使用R根据其他列创建新变量

来自分类Dev

使用R根据其他列创建新变量

来自分类Dev

根据其他变量的条件在数据表中创建新变量

来自分类Dev

根据可能存在于多个其他变量中的值创建新的Stata变量

来自分类Dev

根据其他几个变量的值创建新变量

来自分类Dev

R代码:如何根据其他变量的多个条件生成变量

来自分类Dev

根据在r中包含特定值的其他变量创建一个新变量

来自分类Dev

根据R中其他两个变量之间的数值差异创建新变量

来自分类Dev

根据在r中包含特定值的其他变量创建一个新变量

来自分类Dev

创建具有其他多个变量条件的变量

来自分类Dev

简化多个相似的变量

来自分类Dev

R data.table:根据名称存储在其他位置的变量选择行

来自分类Dev

多个名称相似的数组,使用变量进行访问

来自分类Dev

根据其他列中值的大小创建新变量

来自分类常见问题

如何在R中其他条件下创建新变量

来自分类Dev

如何在R中其他条件下创建新变量

来自分类Dev

R - 使用变量中的值有条件地从其他变量中选择多个值

来自分类Dev

R:根据列表元素名称创建新的数据框变量

来自分类Dev

如何选择名称相似的多个列

来自分类Dev

根据R中的条件总结和创建新变量

来自分类Dev

如何有效地根据其他索引变量上的条件创建变量?

来自分类Dev

根据其他外部函数创建变量

来自分类Dev

SAS根据其他变量创建ID

来自分类Dev

根据其他三个变量之间的比较创建新变量

来自分类Dev

根据索引位置和其他变量的值创建新变量

来自分类Dev

根据其他数据集中的其他值创建变量

Related 相关文章

  1. 1

    R:如何根据其他列的名称创建新变量

  2. 2

    awk 根据其他列的条件创建新变量

  3. 3

    R-对名称相似的多个变量使用rbind

  4. 4

    使用R根据其他列创建新变量

  5. 5

    使用R根据其他列创建新变量

  6. 6

    根据其他变量的条件在数据表中创建新变量

  7. 7

    根据可能存在于多个其他变量中的值创建新的Stata变量

  8. 8

    根据其他几个变量的值创建新变量

  9. 9

    R代码:如何根据其他变量的多个条件生成变量

  10. 10

    根据在r中包含特定值的其他变量创建一个新变量

  11. 11

    根据R中其他两个变量之间的数值差异创建新变量

  12. 12

    根据在r中包含特定值的其他变量创建一个新变量

  13. 13

    创建具有其他多个变量条件的变量

  14. 14

    简化多个相似的变量

  15. 15

    R data.table:根据名称存储在其他位置的变量选择行

  16. 16

    多个名称相似的数组,使用变量进行访问

  17. 17

    根据其他列中值的大小创建新变量

  18. 18

    如何在R中其他条件下创建新变量

  19. 19

    如何在R中其他条件下创建新变量

  20. 20

    R - 使用变量中的值有条件地从其他变量中选择多个值

  21. 21

    R:根据列表元素名称创建新的数据框变量

  22. 22

    如何选择名称相似的多个列

  23. 23

    根据R中的条件总结和创建新变量

  24. 24

    如何有效地根据其他索引变量上的条件创建变量?

  25. 25

    根据其他外部函数创建变量

  26. 26

    SAS根据其他变量创建ID

  27. 27

    根据其他三个变量之间的比较创建新变量

  28. 28

    根据索引位置和其他变量的值创建新变量

  29. 29

    根据其他数据集中的其他值创建变量

热门标签

归档