我收到的数据包含许多类似的变量,还有一个附加变量指示哪些变量one我真正想要的那些类似的变量。使用循环我可以查找正确的值,但是数据很大,循环很慢,而且看起来这应该是可矢量化的。我只是还没弄清楚怎么做。
编辑:所选变量将用作同一数据框中的新变量,因此顺序很重要。还有许多其他变量未在下面给出的示例中显示。
示例数据集:
set.seed(0)
df <- data.frame(yr1 = sample(1000:1100, 8),
yr2 = sample(2000:2100, 8),
yr3 = sample(3000:3100, 8),
yr4 = sample(4000:4100, 8),
var = paste0("yr", sample(1:4, 8, replace = TRUE)))
# df
#
# yr1 yr2 yr3 yr4 var
# 1 1090 2066 3050 4012 yr3
# 2 1026 2062 3071 4026 yr2
# 3 1036 2006 3098 4038 yr1
# 4 1056 2020 3037 4001 yr4
# 5 1088 2017 3075 4037 yr3
# 6 1019 2065 3089 4083 yr4
# 7 1085 2036 3020 4032 yr1
# 8 1096 2072 3061 4045 yr3
这个循环方法可以达到目的,但速度慢且笨拙:
ycode <- character(nrow(df))
for(i in 1:nrow(df)) {
ycode[i] <- df[i, df$var[i]]
}
df$ycode <- ycode
# df
# yr1 yr2 yr3 yr4 var ycode
# 1 1090 2066 3050 4012 yr3 3050
# 2 1026 2062 3071 4026 yr2 2062
# 3 1036 2006 3098 4038 yr1 1036
# 4 1056 2020 3037 4001 yr4 4001
# 5 1088 2017 3075 4037 yr3 3075
# 6 1019 2065 3089 4083 yr4 4083
# 7 1085 2036 3020 4032 yr1 1085
# 8 1096 2072 3061 4045 yr3 3061
看来我应该能够对其进行矢量化,如下所示:
df$ycode <- df[, df$var]
但我发现结果令人惊讶:
# yr1 yr2 yr3 yr4 var ycode.yr3 ycode.yr2 ycode.yr1 ycode.yr4 ycode.yr3.1 ycode.yr4.1 ycode.yr1.1 ycode.yr3.2
# 1 1090 2066 3050 4012 yr3 3050 2066 1090 4012 3050 4012 1090 3050
# 2 1026 2062 3071 4026 yr2 3071 2062 1026 4026 3071 4026 1026 3071
# 3 1036 2006 3098 4038 yr1 3098 2006 1036 4038 3098 4038 1036 3098
# 4 1056 2020 3037 4001 yr4 3037 2020 1056 4001 3037 4001 1056 3037
# 5 1088 2017 3075 4037 yr3 3075 2017 1088 4037 3075 4037 1088 3075
# 6 1019 2065 3089 4083 yr4 3089 2065 1019 4083 3089 4083 1019 3089
# 7 1085 2036 3020 4032 yr1 3020 2036 1085 4032 3020 4032 1085 3020
# 8 1096 2072 3061 4045 yr3 3061 2072 1096 4045 3061 4045 1096 3061
我还尝试了 *apply 的多种变体,但没有一个能够接近。一些尝试:
> apply(df, 1, function(x) x[x$var])
Error in x$var : $ operator is invalid for atomic vectors
> apply(df, 1, function(x) x[x[var]])
Error in x[var] : invalid subscript type 'closure'
有任何想法吗?非常感谢..