根据列的特定模式在R中设置数据帧

时间:2015-09-15 19:39:06

标签: r vectorization subset

我正在计算数据帧中多对列的r平方。我可以通过单独写出每对的代码来实现这一点,但我想使用apply或其他一些基于我从数据框中选择的列模式的矢量化方法来自动执行此操作。

示例数据:

set.seed(1234)
dat <- data.frame(replicate(18,rnorm(10)))

获得第1列v.2的r平方:

fit <- lm(dat[,1] ~ dat[,2])
summary(fit)$r.squared

但我想做以下所有组合:{1,2},{2,3},{3,1},{4,5},{5,6},{6,4} ......等到第18栏。

换句话说,三个窗口的所有组合每次都会移动到下一个三个窗口。这样我就可以在整个数据帧上调用一次函数,一次得到所有的r平方值,而不是重复18次代码。

5 个答案:

答案 0 :(得分:3)

或者在一行中:

results <- sapply(1:ncol(dat), function(x) summary( lm( dat[ , x ] ~ dat[ ,ifelse( x%%3 != 0, x+1, x-2)]) )$r.squared )

答案 1 :(得分:1)

你可以试试这个:

v1 <- c(1:ncol(dat)) 
v2 <- v1 + c(1L, 1L, -2L) 
m <- cbind(v1,v2)
fit <- lapply(1:length(dat),function(x) lm(dat[,m[x,1]]~dat[,m[x,2]]))
rsq <- sapply(1:length(dat), function(x) summary(fit[[x]])$r.squared)

答案 2 :(得分:0)

应该有效:

results <- apply(combn(colnames(dat), 2), 2, function(x)summary(lm(dat[, x[1]] ~ dat[, x[2]]))$r.squared)

答案 3 :(得分:0)

如果只需要r平方值,可以使用cor函数给出相关矩阵。 r2只是该矩阵中值的平方。

答案 4 :(得分:0)

使用dplyr包的替代流程:

set.seed(1234)
dat <- data.frame(replicate(18,rnorm(10)))

library(dplyr)


data.frame(colnames = names(dat)) %>%        # get the names of columns
  mutate(group = cumsum(ifelse(row_number() %in% seq(1,ncol(dat),3),1,0))) %>%  # create group id based on 3 consecutive columns
  group_by(group) %>%                        # for each group id
  do({cb = combn(.$colnames,2)               # create combinations of column names
      data.frame(col1 = cb[1,],
                 col2 = cb[2,])}) %>%
  mutate(formula = paste(col1,"~",col2)) %>% # create a formula for each combination
  rowwise() %>%                              # for each row/formula
  do(data.frame(formula = .$formula,
                r.sq = summary(lm(.$formula, data=dat))$r.squared)) # create model and get r squared


#      formula         r.sq
#        (chr)        (dbl)
# 1    X1 ~ X2 3.072421e-02
# 2    X1 ~ X3 3.056746e-01
# 3    X2 ~ X3 7.708176e-02
# 4    X4 ~ X5 7.293980e-01
# 5    X4 ~ X6 3.244157e-01
# 6    X5 ~ X6 2.231886e-01
# 7    X7 ~ X8 6.637355e-03
# 8    X7 ~ X9 1.497414e-06
# 9    X8 ~ X9 9.758725e-02
# 10 X10 ~ X11 2.728225e-01
# 11 X10 ~ X12 5.973809e-02
# 12 X11 ~ X12 1.196112e-01
# 13 X13 ~ X14 5.541950e-02
# 14 X13 ~ X15 3.488573e-02
# 15 X14 ~ X15 2.519877e-02
# 16 X16 ~ X17 7.004510e-04
# 17 X16 ~ X18 8.827935e-02
# 18 X17 ~ X18 1.112862e-01

如果您愿意,可以替换mutate(group = cumsum(ifelse(row_number() %in% seq(1,ncol(dat),3),1,0)))(基于3个连续列的窗口创建对)   mutate(group = ntile(row_number(),6))(创建6组连续3列)。