从列索引值创建新变量

3

我的目标是创建一个新变量,其中包含由列索引指示的值。

c <- rep(1:2)
d <- rep(1:10)
e <- c(1,5,7,2,3,9,1,6,9,1)
z <- cbind(d,e,c)

我想创建一个新的变量(f),它的值由c列索引指示。
d   e   c   f
1   1   1   1
2   5   2   5
3   7   1   3
4   2   2   2
5   3   1   5
6   9   2   9
7   1   1   7
8   6   2   6
9   9   1   9
10  1   2   1
2个回答

3
我们可以使用行/列索引来提取“z”矩阵的前两列中的元素,其中行索引是行序列,列索引是“z”矩阵中的 'c' 列。
cbind(z, f = z[,1:2][cbind(seq_len(nrow(z)), z[,"c"])])
#       d e c f
# [1,]  1 1 1 1
# [2,]  2 5 2 5
# [3,]  3 7 1 3
# [4,]  4 2 2 2
# [5,]  5 3 1 5
# [6,]  6 9 2 9
# [7,]  7 1 1 7
# [8,]  8 6 2 6
# [9,]  9 9 1 9
#[10,] 10 1 2 1

谢谢您的回复,当我尝试这个时,我收到了以下错误信息:不支持的索引类型:data.frame - user647764
@user647764 不确定你的错误在哪里。根据提供的示例,它对我有效。 - akrun
1
问题在于我的数据是以tibble格式存在的;将其强制转换为数据框格式解决了问题,这个方法非常有效。谢谢! - user647764

1
一个选项是使用mapply来获得所需的输出。
cbind(z, f = mapply(function(x,y)z[y,x], z[,"c"], 1:nrow(z)))
#    d e c f
# d  1 1 1 1
# e  2 5 2 5
# d  3 7 1 3
# e  4 2 2 2
# d  5 3 1 5
# e  6 9 2 9
# d  7 1 1 7
# e  8 6 2 6
# d  9 9 1 9
# e 10 1 2 1

谢谢你的帮助!当我尝试使用mapply时,它返回一个包含其他列中所有值的列表,有没有办法避免这种情况? - user647764
@user647764 我展示的结果是在使用你提供的数据框上使用 mapply 后得出的。当你在真实的数据框上使用它时,你是否得到了列表?能否请你分享一下你所得到的部分输出? - MKR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接