2014-02-09 68 views
0

如何根據嵌套for循環中其他列的條件重命名列?嵌套循環和列重命名

我試圖做到這一點在R:
如果命名A1列不爲空和列A2通過Akk是一些數)爲空,然後重命名列B2...BkB1_1...B1_k

簡化樣本我的數據:

A1 B1 A2 B2 A3 B3 A4 B4 

1 1  2  3  4 

a b  d  c e f 

的基本概念是,如果Aj是空的,那麼相應的B進入「屬於」的前僱主列索引A[j-1],所以需要重新命名。

我知道這些列的位置在哪裏,所以當我嘗試這樣做時,我在數據框中使用了它們的位置。下面的代碼是什麼,我想這樣做,但我不知道很多[R語法,無法得到任何工作:

for (k in 1:20){ 
for (j in 1:600){ 
for (i in 0:90) { 

    if (df[j,2*i]!="" && df[j,2*i+2*k]=="") {B[i+1_[i+1]]=df[j,1+2*i+2*k]} 

}}} 

我看着計算器上有點類似的職位,但我新手,並不瞭解它的大部分。

+0

可以提供相關的問題嗎? – xlembouras

+0

@xlembouras我在頂部添加了一個常規問題。對不起,如果我不知道我的問題,我的問題。 – user3235

+0

爲了什麼目的?列名是**而不是**你想要測試的列的內容。忘記「建設」 - 有更簡單的方法 - 但告訴我們你想達到什麼。 –

回答

0

注意B1_1...B1_k需要是一個較短的元素,例如, B1_1..B1_k-1

df1 <- data.frame(
    A1=c(1, "a"), 
    B1=c(1, "b"), 
    A2=c("", ""), 
    B2=c(2, "d"), 
    A3=c("", ""), 
    B3=c(3, "c"), 
    A4=c("", "e"), 
    B4=c(4, "f")) 
### get columns which are Empty 
Es <- colnames(df1)[sapply(1:ncol(df1), function(x) all((df1[x])==""))] 
### find largest no. following A in these empties 
k1 <- max(as.integer(gsub("A", "", Es))) 
### replace colums B2..Bk with B1_1...Bk-1 
colnames(df1)[grepl("B", colnames(df1))][2:k1] <- paste0("B1_",seq(k1)[-k1]) 
> df1 
    A1 B1 A2 B1_1 A3 B1_2 A4 B4 
1 1 1  2  3  4 
2 a b  d  c e f 

編輯像這樣嗎?

### get columns with at least one empty cell 
### same as above but replace `all` with `any` 
Es <- colnames(df1)[sapply(1:ncol(df1), function(x) any((df1[x])==""))] 
### find largest no. following A in these empties 
k1 <- max(as.integer(gsub("A", "", Es))) 
### new data frame with columns B2...Bk 
df2 <- df1[grepl("B", colnames(df1))][2:k1] 
### rename 
colnames(df2) <- paste0("B1_",seq(k1)[-k1]) 
> (cbind(df1, df2)) 
    A1 B1 A2 B2 A3 B3 A4 B4 B1_1 B1_2 B1_3 
1 1 1  2  3  4 2 3 4 
2 a b  d  c e f d c f 

生成新的data.frame然後cbind ING的這種做法是不訴內存使用效率,但是這應該沒有多大關係的小尺寸,我認爲它使代碼更易於閱讀。

這裏有一個data.table的做法,避免了在內存中的重複,因此可用於大集:

library(data.table) 
dt1 <- as.data.table(df1) 
### get k1 as above 
### get columns B2...Bk 
Bs <- paste0("B", seq(k1)[-1]) 
### add/assign duplicated columns with new column names using := 
> (dt1[, paste0("B1_",seq(k1)[-k1]) := dt1[, Bs, with=FALSE] ]) 
    A1 B1 A2 B2 A3 B3 A4 B4 B1_1 B1_2 B1_3 
1: 1 1  2  3  4 2 3 4 
2: a b  d  c e f d c f 
+0

是否也可以爲B1_1創建一個新列並保留舊的B_2?那麼是否有可能考慮每一行中的空白?含義B4將是B1_3。 – user3235

+0

非常感謝! – user3235