2017-09-05 7 views
0

은 내가 dataframe이처럼 보이는 (reshape2 :: 캐스트를 사용하여 병합)이 있습니다R : 여러 열의 요인 수준에 따라 값을 빼는 방법은 무엇입니까?

time days treatment extrafactor1 extrafactor2 extrafactor3 animal1 animal2 animal3 
10 83 control B water 2 2 67 40 
10 83 control B water 3 50 67 39 
10 83 control A water 3 22 80 63 
10 83 control A water 2 40 40 100 
10 83 treated A water 3 40 69 92 
10 83 treated A water 1 64 56 6 
10 83 treated A water 2 90 67 52 
10 83 treated B water 2 14 36 77 
10 83 treated B water 3 41 83 55 
10 83 treated B water 1 66 31 51 
11 86 control B water 1 99 100 10 
11 86 control B water 2 23 27 22 
11 86 control A water 3 57 10 65 
11 86 control A water 1 60 2 49 
11 86 control A water 2 23 14 44 
11 86 control B water 3 97 45 20 
11 86 treated B water 2 71 15 24 
11 86 treated B water 3 49 55 63 
11 86 treated A water 3 54 88 27 

을 내가 처리 된 샘플에서 제어 샘플의 다른 동물의 값을 빼지 싶습니다. 물론 빼기는 다른 요인의 수준이 일치하는 곳에서 일어나야하므로 "11_86_treated_A_water_3"의 animal1 값은 "11_86_control_A_water_3"의 animal1 값과 각 동물에 대한 값으로 줄여야합니다. 나는

df2 <- ddply(df, .(time,days,treatment,extrafactor1,extrafactor2,extrafactor3), transform, animal1 = animal1-animal1[treatment=="control"]) 

같은 plyr와 함께 몇 가지 시도를하고 있어요하지만, 나에게의 NA를 많이주고 나는 충분히 내가하고 싶은 것을 실행하기 위해 누락 된 정보가 있었다 확신합니다. 사실 100s의 동물이 있습니다.

내 시도는 여기에서 적응 만에 수행 할 수있는 덜 입력 변수와 적은 열을가한다

: 여기 Easiest way to subtract associated with one factor level from values associated with all other factor levels 과 : R ddply with multiple variables

또한 긴 형식으로 테이블을 재편 할 때까지 기다릴 수있을 것은 그게 ggplot에 대한, 그 일을 쉽게한다면?

나에게 제안이 있으십니까?

+0

안녕하세요! 재현 가능한 예제를 만들려면 https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example을보십시오. 그렇게하면 쉽게 도움이됩니다. – elevendollar

+0

귀하의 예상 출력은 무엇입니까 – Wen

답변

1

가장 우아하지는 않지만 예제에서 이미 언급 한 것처럼 서로 다른 모든 요소가 포함 된 concatated 문자열 인 group_string이라는 새로운 열을 만들 수 있습니다. 그러나 그것이 '통제'인지 '치료 된'것이 마지막 주장이 될 것입니다. 대신

"11_86_treated_A_water_3""11_86_control_A_water_3"

의 예를 들어 당신이

"11_86_A_water_3_treated""11_86_A_water_3_control"

있을 것입니다 그럼 당신은, 예를 들어, 처리/제어 문자열없이 모든 고유 문자열을 통해 루프를 실행할 수 있습니다 하나의 고유 한 문자열은 "11_86_A_water_3_"이고 각 행에 대해서는 group_string에서 "치료 된"행의 group_string에 "제어"가있는 행을 빼십시오.

편집 : 좋습니다. 다른 아이디어가 있습니다. 치료 (시간, 일, extrafactor1, extrafactor2, extrafactor3)를 제외한 모든 요소로 그룹화하여 각 하위 그룹에 대해 두 개의 행을 남겨 둡니다. 그런 다음 diff()을 사용하여 각 하위 그룹에 대한 두 행 간의 차이를 계산합니다.

+0

Hey Elevendollar, 고마워요. 당신의 의견을 많이 주셔서 감사합니다. 나는 연결과 비슷한 경우에 여러 번했는데, 그저 좀 더 우아한 방법이 될 것이라고 생각했습니다 ;-) 내가 알려 드리겠습니다. 당신은 그것이 작동했을 때를 안다. – crazysantaclaus

+0

안녕하세요 @ 크레이지산 클라크. 확실한 것. 재현 가능한 예제 링크를 살펴보십시오. 그에 따라 질문을 편집하면 누군가가 도울 수있을 것이라고 확신합니다. – elevendollar

관련 문제