因此,我想将条目从数据帧的一个列向量(在我的示例中为年龄)转移到新的列向量(经验,我将其定义为经验=年龄-学年)。因此,我可以计算出不同年龄段的入学年限,共有三个不同的波段,例如,在我的示例中,年龄在26岁以下的人在学校学习了14年(其他波段可以在下面的代码中看到)。为了找到经验,我将这些结合在一起。
我运行了下面的代码,但遇到了很多错误,混乱的提示符号,我不理解的有关合成的条目。它只是给我返回了一个向量,其中所有条目均为“ 12岁”,而不是我希望的不同乐队(某些10岁,其他14岁)。
if (df[,4] < 26){
df[,4] - 14
} elseif (df[,4] < 53) {
df[,4] - 12
} else (df[,4] - 10)
任何帮助将不胜感激!
答案 0 :(得分:1)
问题是if
没有向量化。相反,您可以使用ifelse
或dplyr::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创建