r - 특정 데이터 프레임 값을 알 수없는 열 이름으로 바꾸는 방법은 무엇입니까?




(4)

lapply 내에서 ifelse를 사용하는 또 다른 기본 R 옵션 (여전히 열에서는 루핑하지만 열별로 벡터화 된 접근 방식) :

df <- data.frame(id=1:8,unknownvarname1=c(1:4,1:4),unknownvarname2=c(4:1,4:1))
df[,2:3] <- lapply(2:3, function(x) { ifelse(df[,x] < 4, "", colnames(df)[x]) })

준다

  id unknownvarname1 unknownvarname2
1  1                 unknownvarname2
2  2                                
3  3                                
4  4 unknownvarname1                
5  5                 unknownvarname2
6  6                                
7  7                                
8  8 unknownvarname1         

알 수없는 열 이름과 숫자 값 1, 2, 3 또는 4의 큰 데이터 프레임이 있습니다. 이제 4 개의 값을 모두 열 이름으로 바꾸고 1, 2 및 3을 빈 값으로 바꾸고 싶습니다.

물론 나는 이런 종류의 루프를 만들 수 있습니다 :

df <- data.frame(id=1:8,unknownvarname1=c(1:4,1:4),unknownvarname2=c(4:1,4:1))
for (i in 2:length(df)){
  df[,i] <- as.character(df[,i])
  df[,i] <- mgsub::mgsub(df[,i],c(1,2,3,4),c("","","",names(df)[i]))  
}

결과는 다음과 같습니다.

  id unknownvarname1 unknownvarname2
1  1                 unknownvarname2
2  2                                
3  3                                
4  4 unknownvarname1                
5  5                 unknownvarname2
6  6                                
7  7                                
8  8 unknownvarname1 unknownvarname2

데이터 프레임의 경우이 크기는 전혀 문제가되지 않습니다. 그러나 최대 30k 및 최대 40 개의 알려진 변수가있는 대용량 데이터 프레임 에서이 루프를 시도하면 루프가 완료되는 데 시간이 걸립니다.

누구든지 이것을하는 더 빠른 방법을 알고 있습니까? dplyr packagemutate() 와 같은 기능을 시도했지만 제대로 작동시키지 못했습니다.

미리 감사드립니다!


기본 R을 사용하는 편도

#Replace all the values with 1:3 with blank
df[-1][sapply(df[-1], `%in%`, 1:3)] <- ""
#Get the row/column indices where value is 4
mat <- which(df == 4, arr.ind = TRUE)
#Exclude values from first column
mat <- mat[mat[, 2] != 1, ]
#Replace remaining entries with it's corresponding column names
df[mat] <- names(df)[mat[, 2]]
df

#  id unknownvarname1 unknownvarname2
#1  1                 unknownvarname2
#2  2                                
#3  3                                
#4  4 unknownvarname1                
#5  5                 unknownvarname2
#6  6                                
#7  7                                
#8  8 unknownvarname1                

col 을 사용하여 이름과 값을 정렬하는 또 다른 옵션은 다음과 같습니다.

sel <- df[-1]==4
df[-1] <- ""
df[-1][sel] <- names(df[-1])[col(df[-1])[sel]]

#  id unknownvarname1 unknownvarname2
#1  1                 unknownvarname2
#2  2                                
#3  3                                
#4  4 unknownvarname1                
#5  5                 unknownvarname2
#6  6                                
#7  7                                
#8  8 unknownvarname1

sweep 사용하는 또 다른 기본 R 가능성 :

idx <- df[, -1] == 4
sw <- sweep(idx, 2, 1:2, FUN = '*') + 1
df[, -1] <- c("", colnames(df[, -1]))[sw]

이것은 다음을 제공합니다.

> df
  id unknownvarname1 unknownvarname2
1  1                 unknownvarname2
2  2                                
3  3                                
4  4 unknownvarname1                
5  5                 unknownvarname2
6  6                                
7  7                                
8  8 unknownvarname1

이것은 다음과 같이 단축 될 수 있습니다.

sw <- sweep(df[, -1] == 4, 2, 1:2, FUN = '*') + 1
df[, -1] <- c("", colnames(df[, -1]))[sw]



r  

r