使用if语句并创建新列

时间:2020-11-10 19:58:54

标签: r

因此,我想将条目从数据帧的一个列向量(在我的示例中为年龄)转移到新的列向量(经验,我将其定义为经验=年龄-学年)。因此,我可以计算出不同年龄段的入学年限,共有三个不同的波段,例如,在我的示例中,年龄在26岁以下的人在学校学习了14年(其他波段可以在下面的代码中看到)。为了找到经验,我将这些结合在一起。

我运行了下面的代码,但遇到了很多错误,混乱的提示符号,我不理解的有关合成的条目。它只是给我返回了一个向量,其中所有条目均为“ 12岁”,而不是我希望的不同乐队(某些10岁,其他14岁)。

if (df[,4] < 26){
   df[,4] - 14
} elseif (df[,4] < 53) {
    df[,4] - 12 
} else (df[,4] - 10)

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

问题是if没有向量化。相反,您可以使用ifelsedplyr::case_when

使用一些随机示例数据:

set.seed(42)

df <- data.frame(
  a = 1,
  b = 2,
  c = 3,
  d = sample(20:100, 5)
)
df[,4]
#> [1] 68 84 44 93 37

ifelse(df[,4] < 26, df[,4] - 14, ifelse(df[,4] < 53, df[,4] - 12, df[,4] - 10))
#> [1] 58 74 32 83 25

dplyr::case_when(
  df[,4] < 26 ~  df[,4] - 14,
  df[,4] < 53 ~  df[,4] - 12,
  TRUE ~ df[,4] - 10
)
#> [1] 58 74 32 83 25

答案 1 :(得分:0)

您可以使用cut加上一些索引来通过单行代码来实现:

df$exp <- df$age - c(14, 12, 10)[as.numeric(cut(df$age, c(0, 25, 52, Inf)))]

假设您的数据如下所示:

set.seed(69)
df <- data.frame(age = sample(16:70, 10))
df
#>    age
#> 1   47
#> 2   32
#> 3   42
#> 4   17
#> 5   63
#> 6   55
#> 7   28
#> 8   54
#> 9   62
#> 10  66

那么就做

df$exp <- df$age - c(14, 12, 10)[as.numeric(cut(df$age, c(0, 25, 52, Inf)))]

然后df看起来像这样:

df
#>    age exp
#> 1   47  35
#> 2   32  20
#> 3   42  30
#> 4   17   3
#> 5   63  53
#> 6   55  45
#> 7   28  16
#> 8   54  44
#> 9   62  52
#> 10  66  56

reprex package(v0.3.0)于2020-11-10创建