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 가 있습니다.

나는 그것을 가정한다.

  1. 다른 R / RODBC 버전으로 이전 데이터를 생성하므로 형식이 다른 방법으로 생성되었습니다 (다른 설정 - 소수 구분 기호 일 수 있음)
  2. 문제가있는 열에 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

}





levels