2013-08-06 8 views
-1

동일한 열과 다른 행 수를 가진 두 개의 데이터 집합이 있습니다.행을 일치시키고 열을 뺍니다.

> dput(smalldf) 
structure(list(X = structure(1:5, .Label = c("A", "B", "C", "F", 
"G"), class = "factor"), Y = c(1L, 2L, 3L, 6L, 7L), Z = c(10L, 
20L, 30L, 60L, 70L)), .Names = c("X", "Y", "Z"), class = "data.frame", row.names = c(NA, 
-5L)) 


> dput(bigdf) 
structure(list(X = structure(1:7, .Label = c("A", "B", "C", "D", 
"E", "F", "G"), class = "factor"), Y = c(10L, 20L, 30L, 40L, 
50L, 60L, 70L), Z = c(100L, 200L, 300L, 400L, 500L, 600L, 700L 
)), .Names = c("X", "Y", "Z"), class = "data.frame", row.names = c(NA, 
-7L)) 

나는 비슷한 행을 일치시키고 Y 열을 뺍니다. 나는 이것이 아주 간단한 일이라는 것을 알고 있지만 그것을 할 수 없었다! match()을 사용해야합니까? 또는 어떤 종류의 apply() 기능이 여기에 있습니까?

+2

(E, X) 9해야하지 3.'bigdf .... match를 사용하는 것 [rownames (smalldf),] <- bigdf [rownames (smalldf)] - smalldf' – Arun

+0

죄송합니다. 내 편집이 질문에 대해 많이 바뀐 것 같습니다. 건배 – Error404

+0

그 명령이 무엇을하는지 이해하려고 시도하면 약간 편집하면 새로 편집 된 데이터에 맞게 필요에 맞게 변경할 수 있습니다. 우리는 사람들이 자신의 질문에 대한 답변에서 배울 것을 기대합니다. 그래서, 나는 그 일을 너에게 맡길 것이다. – Arun

답변

2

이것은 다소 일반적인 문제입니다. 당신이 시야에 apply이 같은 제안으로 base R에서 할 수있는 한 가지 방법은

# rows of bigdf that appear in smalldf, in order that they appear in smalldf 
idx <- match(rownames(smalldf) , rownames(bigdf)) 

# subtract rows of smalldf from bigdf for rows that appear in smalldf and rbind them with original rows from bigdf that do not appear in samlldf 
result <- rbind((bigdf[ idx , ] - smalldf) , bigdf[ -idx , ]) 

# Order the results 
result <- result[ order(rownames(result)) , ] 
    X Y Z 
A 3 2 5 
B 10 3 7 
C 0 0 6 
D 5 3 4 
E 9 -2 20 
내 생각
+0

답변을 주셔서 감사합니다, 명령은 나에게 경고 메시지와 이상한 것들을하고있다. 경고 메시지는 다음과 같습니다. 경고 메시지 : Ops.factor (왼쪽, 오른쪽) : - 요인에 유의하지 않습니다. 또한 행 이름을 변경하고 간단한 dput을 업로드합니다. 명령을 시도 할 수 있도록 잘못 된 것이 무엇인지 이해할 수 없습니다. 감사합니다 – Error404

+3

@ Error404, 귀하의 데이터는 귀하가 편집 한 질문에 설명 된 것이 아닙니다 !!! 이것은 나를 매우 좌절하게 만듭니다. X 열은 더 이상 정수 데이터가 아니지만 이전에는 rownames의 요소였습니다. 예 : 변경 'rownames (bigdf)'를'bigdf $ x'로 바꾸고'smalldf '도 똑같이하십시오. 아마도'bigdf $ x'와'smalldf $ x'를 인자에서 문자로 변환해야 할 것입니다. –

+0

이 @ SimonO101에 대해 많은 사과를하고 있습니다. 저는 이것이 매우 성가시다는 것을 알고 있습니다. 그러나 나는 적절한 예를 만들기 위해 노력하고있었습니다. 답변 주셔서 감사합니다. – Error404

관련 문제