【问题标题】:Create a grouping variable based on columns [duplicate]根据列创建分组变量[重复]
【发布时间】:2020-08-25 22:49:54
【问题描述】:

我正在尝试通过拆分列来创建一个值为 0 和 1 的分组变量。

例如,Var1 将采用值 0,Var2 将采用值 1。

Var1 <- c(12, 12.3, 14.1, 6.2, 2.9, 5, 16.2, 2.3, 4.8, 5.9, 15, 12, 11.1)

Var2 <- c(11.2, 15.1, 16, 7.2, 3.1, 1.2, 5.2, 4.1, 3.1, 11.6, 2.1, 6.5, 9.1)

data <- data.frame(Var1, Var2)

希望使用基本 R 方式和 tidyverse 方式来做到这一点

【问题讨论】:

  • 由于条件不明确,您能显示预期吗
  • 我想创建一个新列,比如group,其中所有Var1 信息的值为0,所有Var2 信息的值为1。例如将其从宽格式更改为长格式,或使其数据整齐。

标签: r


【解决方案1】:

我建议将数据重塑为下一个,然后使用您提到的条件创建新变量:

library(tidyverse)
#Data
Var1 <- c(12, 12.3, 14.1, 6.2, 2.9, 5, 16.2, 2.3, 4.8, 5.9, 15, 12, 11.1)
Var2 <- c(11.2, 15.1, 16, 7.2, 3.1, 1.2, 5.2, 4.1, 3.1, 11.6, 2.1, 6.5, 9.1)
data <- data.frame(Var1, Var2)
#Reshape
data %>% pivot_longer(cols = c(Var1,Var2)) %>%
  mutate(Var=ifelse(name=='Var1',0,ifelse(name=='Var2',1,NA)))

输出:

# A tibble: 26 x 3
   name  value   Var
   <chr> <dbl> <dbl>
 1 Var1   12       0
 2 Var2   11.2     1
 3 Var1   12.3     0
 4 Var2   15.1     1
 5 Var1   14.1     0
 6 Var2   16       1
 7 Var1    6.2     0
 8 Var2    7.2     1
 9 Var1    2.9     0
10 Var2    3.1     1
# ... with 16 more rows

【讨论】:

    【解决方案2】:

    由于我们只有两列,所以我们可以在创建逻辑向量后直接强制转换为二进制

    library(dplyr)
    library(tidyr)
    data %>%
           pivot_longer(everything()) %>% 
           mutate(grp = +(name == 'Var2'))
    # A tibble: 26 x 3
    #   name  value   grp
    #   <chr> <dbl> <int>
    # 1 Var1   12       0
    # 2 Var2   11.2     1
    # 3 Var1   12.3     0
    # 4 Var2   15.1     1
    # 5 Var1   14.1     0
    # 6 Var2   16       1
    # 7 Var1    6.2     0
    # 8 Var2    7.2     1
    # 9 Var1    2.9     0
    #10 Var2    3.1     1
    # … with 16 more rows
    

    我们也可以在 base R 中不进行任何重塑就可以做到这一点

    +(names(data) == 'Var2')[col(data)]
    #[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
    

    【讨论】:

    • 太好了,有基本的 R 方式吗?
    • @TyperWriter 更新了基础 R
    猜你喜欢
    • 2019-08-12
    • 2019-01-23
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多