2016-08-05 5 views
1

여러 데이터 프레임이 비어 있는지 확인하고 비어 있으면 값을 할당해야합니다. 이 코드에 다음 코드를 사용합니다.lapply를 사용하여 여러 데이터 프레임을 조작하는 R

a = data.frame() 
b = data.frame() 

x = list(a, b) 

cc = lapply(x, function(x) 
     if(is.data.frame(x) && nrow(x)==0){ 
      x= data.frame("11111") 
     }) 

그러나 결과는 목록에 표시됩니다. 목록에 데이터 프레임을 넣지 않고이 조작을 수행하는 방법이 있는지 알고 싶습니다.

+3

당신은 여러 data.frames가있는 경우 'X'이면에 보관하는 것이 좋습니다 복귀'else'이 필요합니다 '목록' – akrun

답변

0

akrun과 마찬가지로, 비어 있지 않은 경우를 대비하여 x를 반환하는 else 분기가 있어야합니다 코드가 항상 비어 있습니다. 그렇지 않으면 데이터에 특정 열이 항상 있으면 적절한 비어있는 data.frame을 준비합니다. 표기법으로 열을 준비하여 사용하는 코드입니다. 숫자 (0), 문자 (0), 정수 (0) 등. 당신의 빈 data.frames가 일치하는 경우

emptyframe = data.frame(num = numeric(0), name = character(0)) 

a = emptyframe 
b = data.frame(num = 1:2, name = paste("ID", 1:2)) 
c = data.frame(num = 6:8, name = paste("ID", 6:8)) 
d = emptyframe 

x = list(a, b, c, d) 

combined = lapply(x, function(x){ 
    if(is.data.frame(x) && nrow(x)==0){ 
     # Creating an empty data frame you'd preferably want to know before-hand what kind of variables you will have 
     emptyframe 
    }else{ # I would also cast it data.frame before returning, as it may have just failed cause of is.data.frame == FALSE 
     as.data.frame(x) 
    } 
}) 

combined 

#> combined 
#[[1]] 
#[1] num name 
#<0 rows> (or 0-length row.names) 
# 
#[[2]] 
# num name 
#1 1 ID 1 
#2 2 ID 2 
# 
#[[3]] 
# num name 
#1 6 ID 6 
#2 7 ID 7 
#3 8 ID 8 
# 
#[[4]] 
#[1] num name 
#<0 rows> (or 0-length row.names) 

, 그런 다음 그들은 정기적으로 간주되므로, 위의 방법을 사용하여 data.frames 함께 할 수있는 깔끔한 물건을 많이가있다. 예를 들어, 고려 하나의 큰 data.frame으로 그들을 행을 결합 :

do.call("rbind", combined) 

#> do.call("rbind", combined) 
# num name 
#1 1 ID 1 
#2 2 ID 2 
#3 6 ID 6 
#4 7 ID 7 
#5 8 ID 8  
관련 문제