В этом случае только с 2 столбцами ifelse
может быть самым быстрым и самым простым решением.
df$answer <- ifelse(df[,1] == "col1",df[,"col1"],df[,"col2”])
col col1 col2 answer
1 col1 1 5 1
2 col2 2 6 6
3 col1 3 7 3
4 col2 4 8 8
Дополнение как N8TRO в своем комментарии для более общего решения. Простой switch
может быть все, что необходимо:
for(i in 1:nrow(df)) df$ans[i] <- switch(df[i,1],df[i,df[i,1]])
или без "для" цикла:
df$ans <- sapply(1:nrow(df),function(i) switch(df[i,1],df[i,df[i,1]]))
пример:
df <- data.frame(col=sample(paste0('col',1:5),10,replace=T),col1=1:10,col2=11:20,col3=21:30,col4=31:40,col5=41:50,stringsAsFactors = F)
выбрать элементы:
df$ans <- sapply(1:nrow(df),function(i) switch(df[i,1],df[i,df[i,1]]))
df
col col1 col2 col3 col4 col5 ans
1 col1 1 11 21 31 41 1
2 col1 2 12 22 32 42 2
3 col5 3 13 23 33 43 43
4 col2 4 14 24 34 44 14
5 col3 5 15 25 35 45 25
6 col4 6 16 26 36 46 36
7 col5 7 17 27 37 47 47
8 col3 8 18 28 38 48 28
9 col1 9 19 29 39 49 9
10 col5 10 20 30 40 50 50
Как я s 'answer' определен? – vaettchen
Это число, которое находится в столбце, заданном df $ col – OldMcFartigan
df $ answer = unlist (lapply (1: (dim (df) [1]), function (idx) df [idx, df [, df $ col [idx]])), похоже, работает, но может быть, что-то лучше? – OldMcFartigan