r group_by 함수 합치기
보이지 않는 문자열 값을 가진 새로운 레코드를 데이터 프레임에 추가 할 때 보이지 않는 요소 레벨. 경고와 결과가 없음 (5)
2001에서 2007까지의 대금 청구 데이터가 포함 된 대형 데이터 프레임 (14552 행 × 15 열)이 있습니다. sqlFetch를 사용하여 2008 데이터를 가져 왔습니다. 지난 7 년 동안의 데이터에 2008 년 데이터를 추가하려면 다음과 같이합니다.
alltime <- rbind(alltime,all2008)
불행히도
경고 메시지 :
[<-.factor
(*tmp*
, ri, value = c (NA, NA, NA, NA, NA, NA, NA,
내 생각에 이전 데이터 프레임에 이름이 없었던 일부 새로운 환자가 있었기 때문에 어떤 수준인지 알 수 없었습니다. 마찬가지로 추천 의사 열의 새로운 보이지 않는 이름.
R이 데이터를 가져 오는 방식으로 숫자가 무엇인지 자동으로 계산해 내고 그렇지 않은 경우 (따라서 요인이 됨) 훌륭합니다. 더 이상 조작하지 않으면 고통이 될 때까지 훌륭합니다. 내 문제를 우아하게 극복하려면 어떻게해야합니까?
https://ffff65535.com
"쉬운"방법은 텍스트 데이터를 가져올 때 단순히 문자열을 요소로 설정하지 않는 것입니다.
read.{table,csv,...}
함수는 기본적으로 TRUE
설정된 stringsAsFactors
매개 변수를 사용 TRUE
. 데이터를 가져 오거나 rbind
하는 동안 이것을 FALSE
설정할 수 있습니다.
끝 부분에 열을 설정하려면이 작업을 수행 할 수도 있습니다.
예 :
alltime <- read.table("alltime.txt", stringsAsFactors=FALSE)
all2008 <- read.table("all2008.txt", stringsAsFactors=FALSE)
alltime <- rbind(alltime, all2008)
# If you want the doctor column to be a factor, make it so:
alltime$doctor <- as.factor(alltime$doctor)
1) stringsAsFactor가 FALSE로 설정된 데이터 프레임을 만듭니다. 이것은 요인 문제를 해결해야합니다.
2) 나중에 rbind를 사용하지 마십시오. 데이터 프레임이 비어 있으면 열 이름이 엉망입니다. 단순히 다음과 같이하십시오.
df[nrow(df)+1,] <- c("d","gsgsgd",4)
/
> df <- data.frame(a = character(0), b=character(0), c=numeric(0))
> df[nrow(df)+1,] <- c("d","gsgsgd",4)
Warnmeldungen:
1: In `[<-.factor`(`*tmp*`, iseq, value = "d") :
invalid factor level, NAs generated
2: In `[<-.factor`(`*tmp*`, iseq, value = "gsgsgd") :
invalid factor level, NAs generated
> df <- data.frame(a = character(0), b=character(0), c=numeric(0), stringsAsFactors=F)
> df[nrow(df)+1,] <- c("d","gsgsgd",4)
> df
a b c
1 d gsgsgd 4
데이터 프레임을 만들 때 문자열 열을 factor factors ( stringsAsFactors=T
)로 만들거나 문자열로 유지할 수 있습니다.
귀하의 경우, 문자열 열의 요인이되지 않도록하십시오. 그것들을 문자열로 유지 한 다음 잘 동작을 추가하십시오. 요소가 궁극적으로 요소가 필요한 경우 모든 삽입을 수행하고 먼저 문자열로 추가 한 다음 요소로 변환하십시오.
문자열 열을 요소로 만들고 보이지 않는 값을 포함하는 행을 추가하면 새로운 보이지 않는 요소 수준에서 언급 한 오류가 발생하고 그 값은 NA로 바뀝니다.
> df <- data.frame(patient=c('Ann','Bob','Carol'), referring_doctor=c('X','Y','X'), stringsAsFactors=T)
patient referring_doctor
1 Ann X
2 Bob Y
3 Carol X
> df <- rbind(df, c('Denise','Z'))
Warning messages:
1: In `[<-.factor`(`*tmp*`, ri, value = "Denise") :
invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, ri, value = "Z") :
invalid factor level, NA generated
> df
patient referring_doctor
1 Ann X
2 Bob Y
3 Carol X
4 <NA> <NA>
따라서 문자열 열의 요소가되지 않도록하십시오. 그것들을 문자열로 유지하고, 잘 동작을 추가하십시오 .
> df <- data.frame(patient=c('Ann','Bob','Carol'), referring_doctor=c('X','Y','X'), stringsAsFactors=F)
> df <- rbind(df, c('Denise','Z'))
patient referring_doctor
1 Ann X
2 Bob Y
3 Carol X
4 Denise Z
기본 동작을 변경하려면 다음과 같이하십시오 .
options(stringsAsFactors=F)
개별 열을 문자열 또는 요소로 변환하거나 변환하려면
df$col <- as.character(df$col)
df$col <- as.factor(df$col)
두 개의 데이터 프레임에서 유형이 일치하지 않아 발생할 수 있습니다.
우선 모든 수표 유형 (클래스). 진단 목적으로 다음을 수행하십시오.
new2old <- rbind( alltime, all2008 ) # this gives you a warning
old2new <- rbind( all2008, alltime ) # this should be without warning
cbind(
alltime = sapply( alltime, class),
all2008 = sapply( all2008, class),
new2old = sapply( new2old, class),
old2new = sapply( old2new, class)
)
다음과 같은 행이있을 것으로 예상됩니다.
alltime all2008 new2old old2new
... ... ... ... ...
some_column "factor" "numeric" "factor" "character"
... ... ... ... ...
그렇다면 설명 : rbind
는 유형 일치를 확인하지 않습니다. rbind.data.frame
코드를 분석하면 첫 번째 인수가 출력 유형을 초기화했음을 알 수 있습니다. 첫 번째 data.frame 유형이 요소 인 경우 출력 data.frame 열은 unique(c(levels(x1),levels(x2)))
수준 unique(c(levels(x1),levels(x2)))
입니다. 그러나 두 번째 data.frame 열이 factor가 아니면 levels(x2)
이 NULL
이므로 수준이 확장되지 않습니다.
출력 데이터가 잘못되었음을 의미합니다! 진실한 가치 대신에 NA
가 있습니다.
나는 그것을 가정한다.
- 다른 R / RODBC 버전으로 이전 데이터를 생성하므로 형식이 다른 방법으로 생성되었습니다 (다른 설정 - 소수 구분 기호 일 수 있음)
- 문제가있는 열에 NULL 또는 특정 데이터가 있습니다 (예 : 누군가가 데이터베이스 아래의 열을 변경합니다.
해결책:
틀린 칼럼을 찾아서 틀린 이유를 찾는다. 증상이 아니라 원인을 제거하십시오.
여기에 2 개의 데이터 프레임의 공통 행 이름을 취하는 함수가 있는데, 우리가 기본적으로 요소 인 필드를 찾고, 새로운 요소를 추가 한 다음 rbind를 수행하는 rbind를 수행합니다. 이것은 모든 요소 문제를 처리해야합니다 :
rbindCommonCols <- 함수 (x, y) {
commonColNames = intersect(colnames(x), colnames(y))
x = x[,commonColNames]
y = y[,commonColNames]
colClassesX = sapply(x, class)
colClassesY = sapply(y, class)
classMatch = paste( colClassesX, colClassesY, sep = "-" )
factorColIdx = grep("factor", classMatch)
for(n in factorColIdx){
x[,n] = as.factor(x[,n])
y[,n] = as.factor(y[,n])
}
for(n in factorColIdx){
x[,n] = factor(x[,n], levels = unique(c( levels(x[,n]), levels(y[,n]) )))
y[,n] = factor(y[,n], levels = unique(c( levels(y[,n]), levels(x[,n]) )))
}
res = rbind(x,y)
res
}