2013-03-05 1 views
32

동일한 크기가 아닌 두 개의 데이터 세트가 있습니다. 나는 보고서에 들어가는 그래프에서 잡음을 제거하기 위해 B에 있지 않은 A의 값을 자르고 그 반대도 마찬가지입니다. (이 데이터를 영구적으로 삭제되지 않는, 걱정하지 마세요!)값 벡터를 기반으로 R의 데이터 프레임에서 행을 서브 세트화할 수 있습니까?

나는 다음과 같은 읽고 :

하지만 ' 아직도이 일을 올바르게 할 수는 없습니다. 내 코드는 다음과 같습니다.

bg2011missingFromBeg <- setdiff(x=eg2011$ID, y=bg2011$ID) 
#attempt 1 
eg2011cleaned <- subset(eg2011, ID != bg2011missingFromBeg) 
#attempt 2 
eg2011cleaned <- eg2011[!eg2011$ID %in% bg2011missingFromBeg] 

첫 번째 시도는 결과 setdiff 벡터의 첫 번째 값을 제거합니다. 두 번째 시도 수율 및 다루기 힘든 오류 :

Error in `[.data.frame`(eg2012, !eg2012$ID %in% bg2012missingFromBeg) 
: undefined columns selected 
+0

'병합'을 시도 했습니까? – A5C1D2H2I1M1N2O1R2T1

+0

여기서 '병합'이 적절하지 않다고 생각합니다. 데이터 세트를 결합하는 것을 원하지 않습니다. – Zelbinian

+8

아니요, '병합'이 적절하다고 생각합니다. 내부 조인은 A와 B 둘 다에있는 행만 제공합니다. 병합이 불필요한 것을 추가하면 결과 열을 부분 집합 할 수 있습니다. – joran

답변

49

이 당신이 원하는 당신을 줄 것이다 : 당신이 일반적으로, ,

을 잊었 때문에

eg2011cleaned <- eg2011[!eg2011$ID %in% bg2011missingFromBeg, ] 

두 번째 시도에서 오류가있다 편의상, 은 2d object에 대한 부분 집합 열입니다. 행을 부분 집합 화하고 모든 열을 유지하려면 object[index_rows, index_columns] 사양을 사용하고 index_cols은 공백으로 두어 기본값으로 모든 열을 사용합니다.

그러나 하위 열 집합 대신 하위 집합을 가져 오려면 여전히 ,을 포함해야합니다. 당신은 정말 모두 데이터 프레임에 존재하는 인덱스에 의해 각각의 데이터 프레임을 부분 집합하려면

+0

예, 그러면 문제가 해결됩니다. 누군가가 정말로 영리한 것을 생각해내는 경우를 대비하여 다른 대답을 기다릴 것입니다. :) – Zelbinian

+0

논리적 명령문을'subset (eg2011,! ID % in % bg2011missingFromBeg) '로 바꾸면'subset'이 작동 할 것입니다. –

+0

이것은 실제로 제가 쓴 것과 같은 대답입니다. 당신의 문제를 직접적으로 해결할 수 있기 때문에 adibender의 대답을 선택하십시오. 나중에 다른 사람이이 페이지를 비틀 거리게되면 다른 사람들이 더 강력한 참고 자료로 사용할 수 있도록 추가했습니다. – Dinre

14

, 당신은 지금처럼 '일치'기능이 작업을 수행 할 수 있습니다

data_A[match(data_B$index, data_A$index, nomatch=0),] 
data_B[match(data_A$index, data_B$index, nomatch=0),] 

는이하지만, 동일하게 : 여기

data_A[data_A$index %in% data_B$index,] 
data_B[data_B$index %in% data_A$index,] 

데모입니다 : 원래의 게시물에 코멘트 당

# Set seed for reproducibility. 
set.seed(1) 

# Create two sample data sets. 
data_A <- data.frame(index=sample(1:200, 90, rep=FALSE), value=runif(90)) 
data_B <- data.frame(index=sample(1:200, 120, rep=FALSE), value=runif(120)) 

# Subset data of each data frame by the index in the other. 
t_A <- data_A[match(data_B$index, data_A$index, nomatch=0),] 
t_B <- data_B[match(data_A$index, data_B$index, nomatch=0),] 

# Make sure they match. 
data.frame(t_A[order(t_A$index),], t_B[order(t_B$index),])[1:20,] 

# index  value index.1 value.1 
# 27  3 0.7155661  3 0.65887761 
# 10 12 0.6049333  12 0.14362694 
# 88 14 0.7410786  14 0.42021589 
# 56 15 0.4525708  15 0.78101754 
# 38 18 0.2075451  18 0.70277874 
# 24 23 0.4314737  23 0.78218212 
# 34 32 0.1734423  32 0.85508236 
# 22 38 0.7317925  38 0.56426384 
# 84 39 0.3913593  39 0.09485786 
# 5  40 0.7789147  40 0.31248966 
# 74 43 0.7799849  43 0.10910096 
# 71 45 0.2847905  45 0.26787813 
# 57 46 0.1751268  46 0.17719454 
# 25 48 0.1482116  48 0.99607737 
# 81 53 0.6304141  53 0.26721208 
# 60 58 0.8645449  58 0.96920881 
# 30 59 0.6401010  59 0.67371223 
# 75 61 0.8806190  61 0.69882454 
# 63 64 0.3287773  64 0.36918946 
# 19 70 0.9240745  70 0.11350771 
+0

'data_A [data_A $ index % in % data_B $ index]'를 단어로 반복 할 수 있는지 봅시다. 데이터 _A와 데이터 _ 모두에있는 인덱스를 기반으로 data_A의 모든 행을 제공하십시오. 내가 맞습니까? – Zelbinian

+3

@ Zelbinian 구체적으로 말합니다 : data_A의 행의 인덱스 값이 data_B의 인덱스 값에서 찾을 수있는 data_A의 모든 행을주세요. 그것은 약간 다른 진술이지만, 당신은 기본적으로 정확합니다. 유일한 차이점은 특별히 data_A의 행 번호를 원한다는 것입니다.당신이 진술을 뒤집 으면, 그것은 올바르게 작동하지 않을 것입니다. – Dinre

+0

재현성 좋은 예제 + 설명. –

1

, m erges/조인은이 문제에 적합합니다. 특히 내부 조인은 두 데이터 프레임에있는 값만 반환하므로 setdiff 문을 사용할 필요가 없습니다.

library(dplyr) 
cleanedA <- inner_join(data_A, data_B %>% select(index)) 
cleanedB <- inner_join(data_B, data_A %>% select(index)) 

두 개의 별도의 테이블로 데이터를 유지하려면 다음 dplyr 패키지를 사용

cleanedA <- merge(data_A, data_B[, "index"], by = 1, sort = FALSE) 
cleanedB <- merge(data_B, data_A[, "index"], by = 1, sort = FALSE) 

:

기본 R에서 : Dinre의 예에서 데이터를 사용

, 각각은 자체 변수 만 포함하고 있습니다. join하기 전에 index 변수. 그러면 새로운 변수가 결과 테이블에 추가되지 않습니다.

1

정말 인간 이해 예 어떻게 두 개의 데이터 프레임들을 비교하고, 특정 열에서 동일한 값을 포함하는 행만 유지 (이 I는 %로 %를 사용하고 처음으로)

# Set seed for reproducibility. 
set.seed(1) 

# Create two sample data frames. 
data_A <- data.frame(id=c(1,2,3), value=c(1,2,3)) 
data_B <- data.frame(id=c(1,2,3,4), value=c(5,6,7,8)) 

# compare data frames by specific columns and keep only 
# the rows with equal values 
data_A[data_A$id %in% data_B$id,] # will keep data in data_A 
data_B[data_B$id %in% data_A$id,] # will keep data in data_b 

을 결과 :

> data_A[data_A$id %in% data_B$id,] 
    id value 
1 1  1 
2 2  2 
3 3  3 

> data_B[data_B$id %in% data_A$id,] 
    id value 
1 1  5 
2 2  6 
3 3  7