在R中复制Excel = INDEX()函数

时间:2018-06-08 16:10:07

标签: r indexing

首先,我仍然很了解R的工作原理。我知道如何在Excel中轻松解决这个问题,但想知道R中的等效解决方法。

在R中,我有一个具有以下结构的数据框:

      Type      Type1      Type2     Type3     Type4     Type5
1        3  -9.697640 21.0876111 21.201925 20.306722 18.431434
2        4  -9.697640 21.0876111 21.201925 20.306722 18.431434
3        5  -9.697640 21.0876111 21.201925 20.306722 18.431434
4        1  -9.697640 21.0876111 21.201925 20.306722 18.431434
5        2  -9.697640 21.0876111 21.201925 20.306722 18.431434

我的目标只是添加一个使用Type的最终列,以确定从中提取值的其他5列中的哪一列。因此,对于第1行,将选择Type3下的值,而第2行将从Type4中选择值。

要在Excel中执行此操作,我只需使用=INDEX(B1:F1,A1)即可。我在使用R中的循环之前已经完成了这个,但希望找到一种更有效的方法。

3 个答案:

答案 0 :(得分:1)

没有循环或apply s

的解决方案
df$newcol <- df[cbind(seq(nrow(df)), 1 + df$Type)]
df
#   Type    Type1    Type2    Type3    Type4    Type5   newcol
# 1    3 -9.69764 21.08761 21.20192 20.30672 18.43143 21.20192
# 2    4 -9.69764 21.08761 21.20192 20.30672 18.43143 20.30672
# 3    5 -9.69764 21.08761 21.20192 20.30672 18.43143 18.43143
# 4    1 -9.69764 21.08761 21.20192 20.30672 18.43143 -9.69764
# 5    2 -9.69764 21.08761 21.20192 20.30672 18.43143 21.08761

括号内的对象告诉R为newcol的每一行选择哪一行(左)和列(右)

cbind(seq(nrow(df)), 1 + df$Type)
#      [,1] [,2]
# [1,]    1    4
# [2,]    2    5
# [3,]    3    6
# [4,]    4    2
# [5,]    5    3

答案 1 :(得分:0)

以下是使用apply的一种可能性:

df$final_column <- apply(df, 1, function(x) x[x["Type"] + 1]);
df;
#  Type    Type1    Type2    Type3    Type4    Type5 final_column
#1    3 -9.69764 21.08761 21.20192 20.30672 18.43143     21.20192
#2    4 -9.69764 21.08761 21.20192 20.30672 18.43143     20.30672
#3    5 -9.69764 21.08761 21.20192 20.30672 18.43143     18.43143
#4    1 -9.69764 21.08761 21.20192 20.30672 18.43143     -9.69764
#5    2 -9.69764 21.08761 21.20192 20.30672 18.43143     21.08761

样本数据

df <- read.table(text =
    "      Type      Type1      Type2     Type3     Type4     Type5
1        3  -9.697640 21.0876111 21.201925 20.306722 18.431434
2        4  -9.697640 21.0876111 21.201925 20.306722 18.431434
3        5  -9.697640 21.0876111 21.201925 20.306722 18.431434
4        1  -9.697640 21.0876111 21.201925 20.306722 18.431434
5        2  -9.697640 21.0876111 21.201925 20.306722 18.431434", header = T)

答案 2 :(得分:0)

df$result <- lapply(1:nrow(df), function(i) {
  df[i,df$Type[i]+1]
})

df
  Type    Type1    Type2    Type3    Type4    Type5   result
1    3 -9.69764 21.08761 21.20192 20.30672 18.43143 21.20192
2    4 -9.69764 21.08761 21.20192 20.30672 18.43143 20.30672
3    5 -9.69764 21.08761 21.20192 20.30672 18.43143 18.43143
4    1 -9.69764 21.08761 21.20192 20.30672 18.43143 -9.69764
5    2 -9.69764 21.08761 21.20192 20.30672 18.43143 21.08761