首先,我仍然很了解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中的循环之前已经完成了这个,但希望找到一种更有效的方法。
答案 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