【问题标题】:R:用 1 替换非零数据 [重复]
【发布时间】:2022-01-23 11:23:39
【问题描述】:

我正在使用 R 编程语言。假设我有以下数据:

> head(my_data)
  survey_1_var_1 survey_1_var_2 survey_1_var_3 survey_2_var_4 survey_2_var_5 survey_2_var_6 survey_3_var_7 survey_3_var_8 survey_3_var_9 g
1       15.22394       0.000000      16.657620       0.000000       6.646745       9.146625        0.00000        0.00000      0.0000000 C
2        0.00000      21.144729       0.000000       0.000000      13.974305       0.000000       10.83326        0.00000     11.0154182 A
3       28.21113       0.000000      -3.157330       7.730749      -1.919841      19.842216       18.18518       13.45900     10.6051849 C
4        0.00000       0.000000      -2.125495       0.000000       0.000000      16.317981       11.52731       15.25231      0.0000000 C
5        0.00000       0.000000      -1.331926      16.843596       0.000000     -13.215788       10.61635        0.00000     -0.8529851 B
6      -11.25795       7.150576       0.000000       0.000000       0.000000       8.292532       11.43462        0.00000      0.0000000 A

我的问题有没有办法用 1 替换所有非零数据?

我可以做到这一点:

my_data$survey_1_var_1 = ifelse(survey_1_var_1 >0,1,0)
my_data$survey_1_var_2 = ifelse(survey_1_var_2 >0,1,0)

etc..

但是有没有办法一次性做到这一切?

谢谢!

【问题讨论】:

  • my_data %>% mutate(across(everything(), ~ifelse(.x >0, 1, 0))) 怎么样?您需要先加载 dplyr。这将对数据的所有列执行 ifelse 函数。

标签: r data-manipulation


【解决方案1】:

你可以试试

library(dplyr)

my_data %>%
  mutate(across(where(is.numeric), ~ifelse(.x >0, 1, 0)))

  survey_1_var_1 survey_1_var_2 survey_1_var_3 survey_2_var_4 survey_2_var_5 survey_2_var_6 survey_3_var_7 survey_3_var_8 survey_3_var_9 g
1              1              0              1              0              1              1              0              0              0 C
2              0              1              0              0              1              0              1              0              1 A
3              1              0              0              1              0              1              1              1              1 C
4              0              0              0              0              0              1              1              1              0 C
5              0              0              0              1              0              0              1              0              0 B
6              0              1              0              0              0              1              1              0              0 A

【讨论】:

    【解决方案2】:

    使用dplyracross 语法:

    df %>% 
      mutate(across(starts_with("survey"), ~ ifelse(.>0,1,0)))
    

    【讨论】:

    • 非常感谢您的回答!我找到了一种调整您的代码的方法,以便它将所有这些变量作为“因素”: df %>% mutate(across(starts_with("survey"), ~ as.factor(ifelse(.>0,1,0) )))
    • @stats555 看起来这些并没有捕捉到负数。负数分配一个 0。
    【解决方案3】:

    我会更进一步,将值转换为布尔值(TRUE 表示非零,FALSE 表示0),然后将它们转换回带有+ 前缀的整数:

    library(dplyr)
    df %>% mutate(across(where(is.numeric), ~ +as.logical(.x)))
    

    输出:

      survey_1_var_1 survey_1_var_2 survey_1_var_3 survey_2_var_4 survey_2_var_5 survey_2_var_6 survey_3_var_7 survey_3_var_8 survey_3_var_9 g
    1              1              0              1              0              1              1              0              0              0 C
    2              0              1              0              0              1              0              1              0              1 A
    3              1              0              1              1              1              1              1              1              1 C
    4              0              0              1              0              0              1              1              1              0 C
    5              0              0              1              1              0              1              1              0              1 B
    6              1              1              0              0              0              1              1              0              0 A
    

    【讨论】:

      【解决方案4】:

      这里也是一个基本的 R 选项。

      isnum <- sapply(df, is.numeric)
      
      df[,isnum] <- as.data.frame(ifelse(df[,isnum] > 0 | df[,isnum] < 0, 1, 0))
      

      输出

        survey_1_var_1 survey_1_var_2 survey_1_var_3 survey_2_var_4 survey_2_var_5 survey_2_var_6 survey_3_var_7 survey_3_var_8 survey_3_var_9 g
      1              1              0              1              0              1              1              0              0              0 C
      2              0              1              0              0              1              0              1              0              1 A
      3              1              0              1              1              1              1              1              1              1 C
      4              0              0              1              0              0              1              1              1              0 C
      5              0              0              1              1              0              1              1              0              1 B
      6              1              1              0              0              0              1              1              0              0 A
      

      数据

      df <- structure(
        list(
          survey_1_var_1 = c(15.22394, 0, 28.21113, 0, 0,-11.25795),
          survey_1_var_2 = c(0, 21.144729, 0, 0, 0, 7.150576),
          survey_1_var_3 = c(16.65762, 0,-3.15733,-2.125495,-1.331926, 0),
          survey_2_var_4 = c(0, 0, 7.730749, 0, 16.843596, 0),
          survey_2_var_5 = c(6.646745, 13.974305,-1.919841, 0, 0, 0),
          survey_2_var_6 = c(9.146625, 0, 19.842216, 16.317981,-13.215788, 8.292532),
          survey_3_var_7 = c(0, 10.83326, 18.18518, 11.52731, 10.61635, 11.43462),
          survey_3_var_8 = c(0, 0, 13.459, 15.25231, 0, 0),
          survey_3_var_9 = c(0, 11.0154182, 10.6051849, 0,-0.8529851, 0),
          g = c("C", "A", "C", "C", "B", "A")
        ),
        class = "data.frame",
        row.names = c(NA,-6L)
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-09
        • 2019-04-05
        • 1970-01-01
        • 2020-11-07
        • 2019-06-11
        • 1970-01-01
        • 2018-05-04
        • 2013-09-04
        相关资源
        最近更新 更多