2013-06-19 23 views
1

我正嘗試使用循環來打印對應於大型數據框中某行(樣本)的某些特定值的列(變量)。例如添加其中插入行i的值j的列

c1<-c(1,2,3) c2<-c(4,5,6) c3<-c(7,8,9) data<-as.data.frame(rbind(c1,c2,c3))

row V1 V2 V3 
    r1 1 2 3 
    r2 4 5 6 
    r3 7 8 9 

如果RI = j個(j是值的列表),然後我要添加到所述數據幀,其中該行的數值j i被插入到柱中。例如,如果該列表的目標值分別

爲R1 = 2

爲R2 = 12

爲R3 = 7

那麼結果將是

row V1 V2 V3 V4 V5 
    r1 1 2 3 2 1  
    r2 4 5 6 5 4 
    r3 7 8 9 8 7 

有什麼建議?

+0

你是什麼意思與 「爲R1 = 2 R2 = 12,爲R3 = 7」? –

+0

對不起,如果我不清楚。這只是一個示例,對於行1的值爲2,對於行2的值爲12(在示例中不存在)和對於行3的值爲7.謝謝 – user12975

回答

1

假設我們有一個列表,其中每個元素是您想要爲每行匹配的值:

r.values <- list(r1=c(2), r2=c(12), r3=c(7)) 

而且你的數據幀之前:

data <- data.frame(c(1,2,3), c(4,5,6), c(7,8,9)) 

現在,我們要建立一個基於興趣列索引的向量,其中每個行的值匹配r.values

indices <- c() 
for (i in 1:nrow(data)) { 
    indices <- c(indices, which(data[i,] %in% r.values[[i]])) 
} 
data[,indices] 

這給你如下:

V2 V1 
c1 2 1 
c2 5 4 
c3 8 7 

好的是,這可以擴展到跨行查看多個值,或完全忽略行:

r.values <- list(c(2,3), NA, r3=c(7,8)) 

再次運行上面的循環爲您提供:

V2 V3 V1 V2.1 
c1 2 3 1 2 
c2 5 6 4 5 
c3 8 9 7 8 
+0

謝謝!這對我來說可能是最好的解決方案,因爲可以通過非常簡單的方式在特定行中選擇多個值。 ferdinand.kraft的解決方案對我來說似乎也很優雅。 – user12975

1

比方說,您有一個行索引向量rows <- c(1,2,3)和相應值向量val <- c(2, 12, 7)

我們開始創建矢量搶應添加的所有列:

newcols <- c() 

for(i in seq_along(rows)) 
{ 
    temp <- which(data[rows[i],]==val[i]) 

    if(length(temp)==0) temp <- NA 

    newcols[i] <- temp 
} 

現在,我們只需添加您的列:

result <- cbind(data, data[, newcols[!is.na(newcols)]]) 
1
i <- c(1, 2, 3) 
j <- c(2, 12, 7) 

col.idx <- mapply(match, j, split(data, rownames(data))[i]) 
# [1] 2 NA 1 

data.frame(data, data[i, na.omit(col.idx)]) 
# V1 V2 V3 V2.1 V1.1 
# c1 1 2 3 2 1 
# c2 4 5 6 5 4 
# c3 7 8 9 8 7 
相關問題