这是我的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;
谢谢
答案 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)]