在for循环中应用if循环的快速方法

时间:2017-03-23 18:12:11

标签: r performance if-statement for-loop

这是我的df:

a <- data.frame(x1 = 1:3, x2 = 0, GF = c("Pelagic", "Demersal", "Cephalopod"), Pelagic = 6, Demersal = 7, Cephalopod = 8)

我有一个这样的清单:

GF_list <- c("Pelagic", "Demersal", "Cephalopod")

我想将x2列赋予与该行的GF对应的值。所以我这样做

for (i in 1 : nrow(a)) {
  for (j in 1 : length(GF_list)) {
    if (a$GF[i] == GF_list[j]) { 
      a$x2[i] <- a[i,(ncol(a) + (- length(GF_list) + j))]  
    }}
}

但是需要很长时间......(我有一个大数据框)

是否存在更快的方式来应用此归因?我想到了一种消除第一个循环的方法:&#34; for(i in 1:nrow(a))&#34;

谢谢

3 个答案:

答案 0 :(得分:2)

所以你想从每一行中选择一个不同的列?您可以使用数字矩阵从data.frame进行复杂的提取。以下是它的工作原理

NSURL *url = [NSURL URLWithString:@"https://www.youtube.com/get_video_info?video_id=$id&el=embedded&ps=default&eurl=&gl=US&hl=en"];
NSData *data = [NSData dataWithContentsOfURL:url];
NSString *idString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

矩阵有一列用于行号和列号。我们使用a$x2 <- a[cbind(1:nrow(a), match(GF_list, names(a)))] 为每行找到正确的列。

答案 1 :(得分:1)

一种方法是逐行使用apply并从该行的GF列中选择列的值。

a$x2 <- apply(a, 1, function(x) x[x[["GF"]]])
a
#  x1 x2         GF Pelagic Demersal Cephalopod
#1  1  6    Pelagic       6        7          8
#2  2  7   Demersal       6        7          8
#3  3  8 Cephalopod       6        7          8

答案 2 :(得分:1)

这是一个给出数值结果的解决方案:

i <- 1:nrow(a)
j <- which(a$GF %in% GF_list)
as.matrix(a[,(ncol(a)-length(GF_list)+1):ncol(a)])[cbind(i,j)]