문제

여기서는 MyData가 중앙값 위 또는 아래에 있는지 여부를 나타 내기 위해 새 열을 만듭니다.

### MedianSplits based on Whole Data
#create some test data
myDataFrame=data.frame(myData=runif(15),myFactor=rep(c("A","B","C"),5)) 

#create column showing median split
myBreaks= quantile(myDataFrame$myData,c(0,.5,1))
myDataFrame$MedianSplitWholeData = cut(
    myDataFrame$myData,
    breaks=myBreaks, 
    include.lowest=TRUE,
    labels=c("Below","Above"))

#Check if it's correct
myDataFrame$AboveWholeMedian = myDataFrame$myData > median(myDataFrame$myData)
myDataFrame

잘 작동합니다. 이제 똑같은 일을하고 싶지만 각 수준의 MyFactor 내에서 중간 분할을 계산합니다.

나는 이것을 생각해 냈다 :

#Median splits within factor levels
byOutput=by(myDataFrame$myData,myDataFrame$myFactor, function (x) {
     myBreaks= quantile(x,c(0,.5,1))
     MedianSplitByGroup=cut(x,
       breaks=myBreaks, 
       include.lowest=TRUE,
       labels=c("Below","Above"))
     MedianSplitByGroup
     })

ByOutput에는 내가 원하는 것을 포함합니다. 요인 A, B 및 C의 각 요소를 올바르게 분류합니다. 그러나 새로 컴퓨팅 된 중간 분할을 보여주는 새 열인 MyDataFrame $ factorLevelMediansplit을 만들고 싶습니다.

"By"명령의 출력을 유용한 데이터 프레임 열로 어떻게 변환합니까?

아마도 "By"명령은이 작업을 수행하는 R와 같은 방법이 아니라고 생각합니다 ...

업데이트:

Thierry의 accapter ()를 영리하게 사용하는 방법과 Spector의 책에서 "ave"기능을 발견하면 추가 패키지가 필요하지 않은이 솔루션을 찾았습니다.

myDataFrame$MediansByFactor=ave(
    myDataFrame$myData,
    myDataFrame$myFactor,
    FUN=median)

myDataFrame$FactorLevelMedianSplit = factor(
    myDataFrame$myData>myDataFrame$MediansByFactor, 
    levels = c(TRUE, FALSE), 
    labels = c("Above", "Below"))
도움이 되었습니까?

해결책

다음은 PLYR 패키지를 사용하는 솔루션입니다.

myDataFrame <- data.frame(myData=runif(15),myFactor=rep(c("A","B","C"),5))
library(plyr)
ddply(myDataFrame, "myFactor", function(x){
    x$Median <- median(x$myData)
    x$FactorLevelMedianSplit <- factor(x$myData <= x$Median, levels = c(TRUE, FALSE), labels = c("Below", "Above"))
    x
})

다른 팁

여기에 해킹 방법이 있습니다. 해들리는 더 우아한 무언가가있을 수 있습니다.

시작하기 위해, 우리는 간단하게 연결합니다 by 산출:

 R> do.call(c,byOutput)
A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4 C5 
 1  2  2  1  1  1  1  2  1  2  1  2  1  1  2 

그리고 우리가 요인 레벨 1과 2를 얻는 것이 중요합니다. 여기서 우리는 해당 레벨과 새로운 요소를 다시 표시하는 데 사용할 수 있습니다.

R> c("Below","Above")[do.call(c,byOutput)]
 [1] "Below" "Above" "Above" "Below" "Below" "Below" "Below" "Above" 
 [8] "Below" "Above" "Below" "Above" "Below" "Below" "Above"
R> as.factor(c("Below","Above")[do.call(c,byOutput)])
[1] Below Above Above Below Below Below Below Above Below Above 
[11] Below Above Below Below Above
Levels: Above Below

그런 다음 우리는 다음에 할당 할 수 있습니다 data.frame 수정하고 싶었습니다.

R> myDataFrame$FactorLevelMedianSplit <- 
      as.factor(c("Below","Above")[do.call(c,byOutput)])

업데이트: 신경 쓰지 마세요, 우리는 새 열을 추가하기 전에 aa ... ab ... bc ... c를 정렬하기 위해 MyDataFrame을 다시 정렬해야합니다. 운동으로 떠났다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top