2015-02-10 2 views
4

Я пытаюсь обновить кучу столбцов, добавив и вычитая SD для каждого значения столбца. SD для данного столбца.Изменение значений нескольких элементов столбца для фрейма данных в R

Ниже приведен воспроизводимый код, который я придумал, но я считаю, что это не самый эффективный способ сделать это. Может ли кто-нибудь предложить мне лучший способ сделать это?

По существу, имеется 20 строк и 9 столбцов. Мне нужны только два отдельных кадра данных, которые имеют значения для каждого столбца, скорректированные путем добавления SD этого столбца, а другое путем вычитания SD из каждого значения столбца.

##Example 
##data frame containing 9 columns and 20 rows 
Hi<-data.frame(replicate(9,sample(0:20,20,rep=TRUE))) 
##Standard Deviation calcualted for each row and stored in an object - i don't what this objcet is -vector, list, dataframe ? 
Hi_SD<-apply(Hi,2,sd) 
#data frame converted to matrix to allow addition of SD to each value 
Hi_Matrix<-as.matrix(Hi,rownames.force=FALSE) 
#a new object created that will store values(original+1SD) for each variable 
Hi_SDValues<-NULL 
#variable re-created -contains sum of first column of matrix and first element of list. I have only done this for 2 columns for the purposes of this example. however, all columns would need to be recreated 
Hi_SDValues$X1<-Hi_Matrix[,1]+Hi_SD[1] 
Hi_SDValues$X2<-Hi_Matrix[,2]+Hi_SD[2] 
#convert the object back to a dataframe 
Hi_SDValues<-as.data.frame(Hi_SDValues) 

##Repeat for one SD less 
Hi_SDValues_Less<-NULL 
Hi_SDValues_Less$X1<-Hi_Matrix[,1]-Hi_SD[1] 
Hi_SDValues_Less$X2<-Hi_Matrix[,2]-Hi_SD[2] 
Hi_SDValues_Less<-as.data.frame(Hi_SDValues_Less) 

ответ

2

Это работа для sweep (типа ?sweep в R для документации)

Hi <- data.frame(replicate(9,sample(0:20,20,rep=TRUE))) 
Hi_SD <- apply(Hi,2,sd) 
Hi_SD_subtracted <- sweep(Hi, 2, Hi_SD) 
+0

Великий - я рассматриваю это как развертку, применяя SD по столбцам (отсюда и элемент 2) к кадру данных. Но где мы указываем вычитание SD. А как насчет добавления SD к значениям? – oivemaria

+0

снова, посмотрите на '? Sweep', он показывает использование:' sweep (x, MARGIN, STATS, FUN = "-", check.margin = TRUE, ...) '. Функция по умолчанию - «-», измените ее на «+», и она добавит «STATS» к значениям. –

+0

да, спасибо. Я понял это в конечном итоге – oivemaria

1

Вам не нужно преобразовать dataframe в матрицу для того, чтобы добавить SD

Hi<-data.frame(replicate(9,sample(0:20,20,rep=TRUE))) 
Hi_SD<-apply(Hi,2,sd) # Hi_SD is a named numeric vector 

Hi_SDValues<-Hi # Creating a new dataframe that we will add the SDs to 

# Loop through all columns (there are many ways to do this) 
for (i in 1:9){ 
    Hi_SDValues[,i]<-Hi_SDValues[,i]+Hi_SD[i] 
} 
# Do pretty much the same thing for the next dataframe 
Hi_SDValues_Less <- Hi 
for (i in 1:9){ 
    Hi_SDValues[,i]<-Hi_SDValues[,i]-Hi_SD[i] 
} 
Смежные вопросы