使用R中dataframe内的列位置提取值

使用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),

我在寻找某一列中某个数字的值,由另一列中的值指定。所以在某种程度上与Excel中的索引匹配非常相似

这是我的可复制数据

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)]