【问题标题】:R: calculating new variables to a dataset by applying different formulasR:通过应用不同的公式计算数据集的新变量
【发布时间】:2019-11-26 19:48:12
【问题描述】:

我有一个具有以下结构的数据框“数据”:

structure(list(age = c(45, 4, 32, 45), sex = c(1, 0, 1, 0), height = c(165, 
178, 145, 132), weight = c(65, 73, 60, 45)), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))

我想在这个 data.frame 中添加两个新变量(var1,var2),应该使用以下两个公式计算:

var1 = 年龄*身高 +(如果性别==1 则为 4,如果性别==0 则为 2)

var2 = 身高*体重 +(如果年龄>40 则为 1,如果年龄=

我在将两个变量添加到数据框时都有问题,无论是在应用函数时(我试图构建一个函数,但似乎只能应用于单个值而不是所有行中的所有值)。

有人可以帮帮我吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    akrun 建议使用布尔算术是一个很好的建议,但您也可以简单地做一个布尔版本的您自己的表达式,用乘法代替 if 语句。 987654322@)

    data <- structure(list(age = c(45, 4, 32, 45), sex = c(1, 0, 1, 0), height = c(165, 178, 145, 132), weight = c(65, 73, 60, 45)), row.names = c(NA,                                                                                                                                           -4L), class = c("tbl_df", "tbl", "data.frame")) 
    
    data <- within(data, {var1 = age*height + 4*(sex==1) + 2 *(sex==0); 
                          var2 = height*weight + (age>40) + 2 *(age <= 40)})
    #----
    > data
      age sex height weight  var2 var1
    1  45   1    165     65 10726 7429
    2   4   0    178     73 12996  714
    3  32   1    145     60  8702 4644
    4  45   0    132     45  5941 5942
    

    由于两组条件互不相交,因此“不合格”的选择项将分别为 0。

    【讨论】:

      【解决方案2】:

      函数ifelse()是基于向量的,因此它将条件应用于向量中的每个元素。

      df <- structure(list(age = c(45, 4, 32, 45), sex = c(1, 0, 1, 0), height = c(165, 
      178, 145, 132), weight = c(65, 73, 60, 45)), row.names = c(NA, 
      -4L), class = c("tbl_df", "tbl", "data.frame"))
      
      df$var1 <- ifelse(df$sex == 1,(df$age * df$height) + 4,(df$age * df$height) + 2)
      df$var2 <- ifelse(df$age > 40,(df$weight * df$height) + 1,(df$age * df$height) + 2)
      

      最终输出

      > df
      # A tibble: 4 x 6
          age   sex height weight  var1  var2
        <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
      1    45     1    165     65  7429 10726
      2     4     0    178     73   714   714
      3    32     1    145     60  4644  4642
      4    45     0    132     45  5942  5941
      

      【讨论】:

        【解决方案3】:

        我更喜欢来自dplyr 包的工具case_when()。

        您的原始数据是:

        data <- 
        structure(
          list(age = c(45, 4, 32, 45),
               sex = c(1, 0, 1, 0),
               height = c(165, 178, 145, 132),
               weight = c(65, 73, 60, 45)),
          row.names = c(NA, -4L),
          class = c("tbl_df", "tbl", "data.frame"))
        

        新变量的创建者:

        library(dplyr)
        
        data ->
        data %>% mutate(var1 = case_when(sex==1 ~ age*height + 4,
                                         sex==0 ~ age*height + 2),
                        var2 = case_when(age>40 ~ height*weight + 1,
                                         age<=40 ~ height*weight + 2)
        )
        

        结果是:

        # A tibble: 4 x 6
            age   sex height weight  var1  var2
          <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
        1    45     1    165     65  7429 10726
        2     4     0    178     73   714 12996
        3    32     1    145     60  4644  8702
        4    45     0    132     45  5942  5941
        

        【讨论】:

          【解决方案4】:

          我们通过向其添加 1 将逻辑/二进制转换为数字索引并使用它将值更改为 2、4 或仅 1、2 并在计算中使用它

          library(dplyr)
          data %>% 
               mutate(var1 = (age * height) +  c(2, 4)[sex + 1],
                             var2 = (height * weight) + (age <= 40)+1)
          # A tibble: 4 x 6
          #    age   sex height weight  var1  var2
          #  <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
          #1    45     1    165     65  7429 10726
          #2     4     0    178     73   714 12996
          #3    32     1    145     60  4644  8702
          #4    45     0    132     45  5942  5941
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-04
            相关资源
            最近更新 更多