2016-05-21 8 views
2

ここで何度も尋ねられるかもしれませんが、私の関数がデータフレームを返すので、何にも関連付けることはできません。データフレームの各サブセットにカスタム関数を適用し、データフレームを返す

モデルを構築し、ある列に傾き(coeff2)、別の列に切片(coeff1)、ある列に入力レコード数などのデータフレームを出力するカスタム関数があります。理想的には、私は自分のデータフレームを関数に組み込み、関数から出力します。今私は、列に基づいて私の入力データフレームをサブセット化し、それに私の関数を適用したい。

例: -

f.get_reg <- function(df) { 
    linear.model <-lm(df$DM ~ df$FW,) 
    N <- length(df$DM) 
    slope <- coef(linear.model)[2] 
    intercept <- coef(linear.model)[1] 
    S <- summary(linear.model)$sigma 
    df.out <- data.frame (N,slope, intercept, S) 
    return (df.out) 
} 



sample_id  FW  DM StdDev_DM Median_DM Count X90 X60 crit Z.scores 
    6724 116.39 16.20690 0.9560414 16.0293 60 3.35 3.2 3.2  1 
    6724 116.39 16.20690 0.9560414 16.0293 60 3.35 3.2 3.2  1 
    6724 110.24 16.73077 0.9560414 16.0293 60 3.35 3.2 3.2  1 
    6728 110.24 16.73077 0.9560414 16.0293 60 3.35 3.2 3.2  1 
    6728 112.81 16.15542 0.9560414 16.0293 60 3.35 3.2 3.2  1 
    6728 112.81 16.15542 0.9560414 16.0293 60 3.35 3.2 3.2  1 

は今、私はそれぞれのユニークなsample_idsのサブセットと各サブセットのための出力として一つのレコードで出力のみ1つのデータフレームに私の機能を適用したいです。

答えて

5

dplyr

あなたはdplyrdoを使用することができます。

sample_id  N  slope intercept   S 
     (int) (int)  (dbl)  (dbl)  (dbl) 
1  6724  3 -0.08518211 26.12125 7.716050e-15 
2  6728  3 -0.22387160 41.41037 5.551115e-17 

data.table

:与え

library(dplyr) 
df %>% 
    group_by(sample_id) %>% 
    do(f.get_reg(.)) 

data.tableで使用.SD

同じ結果与え
library(data.table) 

df <- data.table(df) 
df[,f.get_reg(.SD),sample_id] 

byを使用して

sample_id N  slope intercept   S 
1:  6724 3 -0.08518211 26.12125 7.716050e-15 
2:  6728 3 -0.22387160 41.41037 5.551115e-17 

ベースR

resultList <- by(df,df$sample_id,f.get_reg) 
sample_id <- names(resultList) 
result <- do.call(rbind,resultList) 
result$sample_id <- sample_id 
rownames(result) <- NULL 

与える:を

N  slope intercept   S sample_id 
1 3 -0.08518211 26.12125 7.716050e-15  6724 
2 3 -0.22387160 41.41037 5.551115e-17  6728 
+0

ありがとうございます。できます。 :) –

関連する問題