2014-08-28 4 views
4

첫 번째 열이 NA이거나 ""인 행을 제외하도록 각 데이터 프레임의 하위 집합을 만들려고합니다. 데이터 프레임을 df 목록에 넣은 다음 각 데이터 프레임에 lapply을 사용했습니다. 코드가 작동하지만 각 데이터 프레임을 하위 집합으로 덮어 쓰는 방법을 모르겠습니다. 다음과 같이 결국 dfs를 부분 집합 및 덮어 쓸 데이터 프레임 목록에 적용

df1 <- data.frame(v1=c(1, 2, 3, NA, NA, NA), v2=rep(1, 6)) 
df2 <- data.frame(v11=c(2, 3, 4, 5, NA, ""), v22=rep(1, 6)) 
df3 <- data.frame(v111=c(3, 4, 5, 6, 7, NA), v222=rep(1, 6)) 

df <- list(df1=df1, df2=df2, df3=df3) 
df 

$df1 
# v1 v2 
# 1 1 1 
# 2 2 1 
# 3 3 1 
# 4 NA 1 
# 5 NA 1 
# 6 NA 1 
# 
# $df2 
# v11 v22 
# 1 2 1 
# 2 3 1 
# 3 4 1 
# 4 5 1 
# 5 <NA> 1 
# 6  1 
# 
# $df3 
# v111 v222 
# 1 3 1 
# 2 4 1 
# 3 5 1 
# 4 6 1 
# 5 7 1 
# 6 NA 1 

lapply(names(df), function(x) df[[x]][!(is.na(df[[x]][,1]) | df[[x]][,1]==""), ]) 

# [[1]] 
# v1 v2 
# 1 1 1 
# 2 2 1 
# 3 3 1 
# 
# [[2]] 
# v11 v22 
# 1 2 1 
# 2 3 1 
# 3 4 1 
# 4 5 1 
# 
# [[3]] 
# v111 v222 
# 1 3 1 
# 2 4 1 
# 3 5 1 
# 4 6 1 
# 5 7 1 

, 나는 것으로, 예를 들어, df3 원하는 :

df3 
# v111 v222 
#1 3 1 
#2 4 1 
#3 5 1 
#4 6 1 
#5 7 1 
+1

좋은 질문을 사용할 수 있습니다. 나는 그것으로부터 몇 가지 것을 배웠다. –

답변

6

당신은 간단하게 할 수 있습니다

df <- lapply(
    names(df), 
    function(x){ 
    df[[x]][!(is.na(df[[x]][,1]) | df[[x]][,1]==""), ] 
    }) 

당신의 lapply 다음과 같은 형태로

df <- lapply(df, function(x) x[!(is.na(x[1]) | x[1] == ""), ]) 

그런 다음에 list2env를 사용 (데이터가 너무 프레임의 이름을 유지하기 위해) 데이터 프레임을 다시 글로벌 환경으로 가져 오려면

list2env(df, .GlobalEnv) 

그럼 그냥

df1 
## v1 v2 
## 1 1 1 
## 2 2 1 
## 3 3 1 

+0

예! 흥미로운 작은 함수,'list2env'. 다른 사람들은 목록에서 dfs를 수정하기 위해 @ nrussell의 대답을 추천 할 수도 있지만 원본 df 개체를 덮어 쓰는 방법을 물었습니다. –

+0

나는 그것에 대해서도 몰랐다. (+1). 이봐 요, 오늘 배워요! –

0

방법에 대한 complete.cases : 당신이 정말 이전의 개체를 덮어 쓰려면

df2[df2==""] <- NA 
lapply(df, FUN = function(x) x[complete.cases(x),]) 

$df1 
    v1 v2 
1 1 1 
2 2 1 
3 3 1 

$df2 
    v11 v22 
1 2 1 
2 3 1 
3 4 1 
4 5 1 

$df3 
    v111 v222 
1 3 1 
2 4 1 
3 5 1 
4 6 1 
5 7 1 

.

dat_list <- lapply(dat, FUN = function(x) x[complete.cases(x),]) 
df1 <- dat_list$df1 
df2 <- dat_list$df2 
df3 <- dat_list$df3 
+0

@charles, 그게 작동 하겠지만, 각 df의 이름을 지정하지 않아도 할 수 있습니다. 예를 들어,'df1 <- dat_list $ df1'이 아닙니다. –

1

이 정보가 필요하십니까? 당신에게

> df 
[[1]] 
    v1 v2 
1 1 1 
2 2 1 
3 3 1 

[[2]] 
    v11 v22 
1 2 1 
2 3 1 
3 4 1 
4 5 1 

[[3]] 
    v111 v222 
1 3 1 
2 4 1 
3 5 1 
4 6 1 
5 7 1 
+0

그것은 내가 찾고있는 것보다 좋을 수도 있습니다. 결과를 목록으로 업데이트했습니다. 하지만 원래의 데이터 프레임 개체를 덮어 쓰고 싶습니다. –

0

하여 새로운 데이터 프레임을 검사 할 수 있습니다 또는 당신은 assign

names1 <- paste0("df", 1:3) 
for(i in seq_along(names1)){ 
x <- get(names1[i]) 
x1 <- x[!(is.na(x[,1])|x[1]==''),] 
assign(names1[i], x1) 
} 

    df1 
    # v1 v2 
#1 1 1 
#2 2 1 
#3 3 1 

df2 
# v11 v22 
#1 2 1 
#2 3 1 
#3 4 1 
#4 5 1 
관련 문제