使用R中dataframe内的列位置提取值
我在寻找某一列中某个数字的值,由另一列中的值指定。所以在某种程度上与Excel中的索引匹配非常相似 这是我的可复制数据使用R中dataframe内的列位置提取值,r,R,我在寻找某一列中某个数字的值,由另一列中的值指定。所以在某种程度上与Excel中的索引匹配非常相似 这是我的可复制数据 set.seed(1) my.df <- data.frame(x2 = sample(c(TRUE, FALSE), 100, replace = TRUE), party1 = sample(100), party2 = sample(100),
set.seed(1)
my.df <- data.frame(x2 = sample(c(TRUE, FALSE), 100, replace = TRUE),
party1 = sample(100),
party2 = sample(100),
party3 = sample(100),
fav.party = sample(c(1,2,3), 100, replace = TRUE))
head(my.df)
x2 party1 party2 party3 fav.party
1 TRUE 39 61 55 2
2 TRUE 51 92 46 2
3 FALSE 89 30 20 1
4 FALSE 18 34 80 1
5 FALSE 3 85 36 1
6 TRUE 86 29 15 3
我已经尝试了apply、which、match和just索引my.df[,2:4]子集中的所有内容,但无法理解如何使用fav.party值来表示位置。非常感谢您的帮助,这已经毁掉了我多年的进步,我觉得这是一个简单的答案。您可以使用矩阵进行子集设置:
my.df[matrix(c(seq_len(nrow(my.df)), my.df[,5]+1), ncol = 2)]
# [1] 91 48 33 45 1 41 29 73 64 23 68 99 57 60 51 50 10 1
# [19] 43 59 78 97 62 37 24 42 71 73 76 53 85 92 82 25 6 4
# [37] 46 30 52 75 37 69 49 3 51 46 77 28 55 93 96 58 42 89
# [55] 100 54 91 29 16 36 100 2 34 13 33 41 55 59 24 5 11 70
# [73] 66 14 17 76 18 63 8 79 52 26 24 14 82 9 97 10 43 2
# [91] 4 45 3 73 56 23 70 71 83 28
或者使用mappy
和[
来获取my.df[,2:4]
在my.df[,5]
中给出的列中的值
mapply("[", asplit(my.df[,2:4], 1), my.df[,5])
#party2 party1 party1 party1 party3 party2 party2 party1 party2 party3 party3
# 91 48 33 45 1 41 29 73 64 23 68
#party1 party2 party1 party1 party2 party1 party1 party1 party1 party2 party2
# 99 57 60 51 50 10 1 43 59 78 97
#party3 party2 party1 party1 party2 party2 party1 party1 party3 party3 party1
# 62 37 24 42 71 73 76 53 85 92 82
#party3 party2 party2 party3 party3 party1 party3 party1 party2 party1 party1
# 25 6 4 46 30 52 75 37 69 49 3
#party3 party2 party2 party2 party1 party3 party3 party3 party2 party2 party2
# 51 46 77 28 55 93 96 58 42 89 100
#party1 party3 party3 party1 party3 party3 party1 party2 party1 party2 party3
# 54 91 29 16 36 100 2 34 13 33 41
#party3 party2 party2 party2 party1 party2 party1 party1 party2 party2 party2
# 55 59 24 5 11 70 66 14 17 76 18
#party3 party1 party3 party2 party3 party3 party3 party2 party2 party1 party3
# 63 8 79 52 26 24 14 82 9 97 10
#party2 party3 party1 party2 party2 party3 party1 party2 party1 party1 party2
# 43 2 4 45 3 73 56 23 70 71 83
#party3
# 28
使用
dplyr
:
my.df%>%
行()
变异(分数=获取(粘贴0(“一方”,fav.party)))
给予
#一个tible:100x6
#顺时针:
x2 party1 party2 party3 fav party分数
1真34 85 29 1 34
2真32 29 92 1 32
3假46 7 84 1 46
4假123596235
5真59 41 99 3 99
6真实417928328
7假74 14 63 3 63
8真实69 49 40 2 49
9正确55 6 20 3 20
10假68 44 45 2 44
#…还有90行
我们可以在base R
my.df[startsWith(names(my.df), 'party')][cbind(seq_len(nrow(my.df)), my.df$fav.party)]
这正是我想要的,谢谢!需要更好地使用MapPl在这种情况下,我会使用矩阵。您好@dander2,您能否更好地描述您期望的输出逻辑。从您的示例中,前3个值似乎是
party1
、party2
和party3
的行最大值,但随后是4th值(18)与此逻辑不匹配。我在其中添加了另外两个值,因为前三个值是最大值只是侥幸。我希望将fav.party的值与第2:4列中这三方的位置匹配。我最终使用了mapply()GKi提供给我的实际列名的逻辑比我的rep代码复杂得多,dplyr方法也不起作用
# A tibble: 100 x 6
# Rowwise:
x2 party1 party2 party3 fav.party score
<lgl> <int> <int> <int> <dbl> <int>
1 TRUE 34 85 29 1 34
2 TRUE 32 29 92 1 32
3 FALSE 46 7 84 1 46
4 FALSE 12 35 96 2 35
5 TRUE 59 41 99 3 99
6 TRUE 41 79 28 3 28
7 FALSE 74 14 63 3 63
8 TRUE 69 49 40 2 49
9 TRUE 55 6 20 3 20
10 FALSE 68 44 45 2 44
# ... with 90 more rows
my.df[startsWith(names(my.df), 'party')][cbind(seq_len(nrow(my.df)), my.df$fav.party)]