참고 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를 생성하는이 방법은 없습니다 V. 메모리 효율적이지만이 문제가 훨씬 작은 크기 안 나는 그것을 코드를 읽기가 쉽게 생각합니다.
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
당신이 관련 질문을 제공 할 수 있습니다
여기에 더 큰 세트를 위해, 이렇게 유용한 메모리 중복을 피하는
data.table
접근 방식인가? – xlembouras@xlembouras 상단에 일반적인 질문을 추가했습니다. 미안 내가 뭘 찾고 있는지 내 게시물을 통해 명확하지 않은 경우. – user3235
무슨 목적으로? 열 이름은 ** 해당 열의 내용을 테스트하려는 항목이 아닌 **입니다. 'for '건설을 잊어 버리십시오 - 더 쉬운 방법이 있습니다. 그러나 당신이 성취하고자하는 것을 말해주십시오. –