将函数应用于R中的每两列

将函数应用于R中的每两列,r,dataframe,apply,R,Dataframe,Apply,是否有方法对数据帧中的每两列使用apply函数?如果我有数据框 dat <- data.frame(A=rnorm(100), B=rnorm(100),C=rnorm(100), D=rnorm(100)) A B C D 0.1511642 -0.44930197 1.821832535 2.0145395 -1.1639599 0.42685832 -0.763015835 -0.7785278 0.8430158

是否有方法对数据帧中的每两列使用apply函数?如果我有数据框

dat <- data.frame(A=rnorm(100), B=rnorm(100),C=rnorm(100), D=rnorm(100))

A           B            C          D
0.1511642 -0.44930197  1.821832535  2.0145395
-1.1639599  0.42685832 -0.763015835 -0.7785278
0.8430158  0.26827386 -0.004560031  0.8823789
0.7103298  0.78512673 -0.968510541  0.5172418
0.8508458  0.05809655  0.391845531  0.7452540
0.2217195 -0.06988857  0.714890499 -1.1536502
但是如果我想在每两列上应用一个函数呢?比如说

coefficients(lm(dat$A~dat$B))
coefficients(lm(dat$C~dat$D))
我有400列,不想每对列写200次。我认为使用列j和j+1的for循环可以工作,但是我想要列a和B之间的关系,然后是列C和D,然后是列E和F等等。不是A列和B列,然后是B列和C列,然后是C列和D列。有没有办法使用E apply或apply系列中的另一个函数来实现这一点

创建一个分组向量g,在其上拆分并在其上重叠lm

注意,如果d=data.framey,x表示响应y和预测值x,则lmd是回归lmy~x,d

或者我们可以使用它,但是,这将导致输出按g排序:

# modify column names
dat3 <- dat2
names(dat3) <- paste0("x", names(dat3))

g <- sub("\\..*", "", names(dat3)) # x1234 x1234 x5678 x5678
reg <- function(nms, dat) do.call("lm", list(reformulate(nms[2], nms[1]), quote(dat)))
L2 <- lapply(split.default(names(dat3), g), reg, dat = dat3)
sapply(L2, coef)
创建一个分组向量g,在其上拆分并在其上重叠lm

注意,如果d=data.framey,x表示响应y和预测值x,则lmd是回归lmy~x,d

或者我们可以使用它,但是,这将导致输出按g排序:

# modify column names
dat3 <- dat2
names(dat3) <- paste0("x", names(dat3))

g <- sub("\\..*", "", names(dat3)) # x1234 x1234 x5678 x5678
reg <- function(nms, dat) do.call("lm", list(reformulate(nms[2], nms[1]), quote(dat)))
L2 <- lapply(split.default(names(dat3), g), reg, dat = dat3)
sapply(L2, coef)
您可以使用mappy/Map每隔两列对数据帧进行子集设置,从而每隔两列重复一个函数。希望这有帮助

使用lm

数据:

您可以使用mappy/Map每隔两列对数据帧进行子集设置,从而每隔两列重复一个函数。希望这有帮助

使用lm

数据:


您可以利用命名约定先堆叠数据,然后对公共ID组进行操作。这可能使将来的分析更容易

我根据注释修改了列名

dat <- data.frame(ID1.score1=rnorm(100), ID1.score2=rnorm(100),ID2.score1=rnorm(100), ID2.score2=rnorm(100))

library(dplyr)
library(stringr)
library(purrr)
现在只需在ID列上分组,并为每个ID拟合模型

fits <- stacked_dat %>%
  group_by(id) %>%
  do(model = lm(score1 ~ score2, data = .))

您可以利用命名约定先堆叠数据,然后对公共ID组进行操作。这可能使将来的分析更容易

我根据注释修改了列名

dat <- data.frame(ID1.score1=rnorm(100), ID1.score2=rnorm(100),ID2.score1=rnorm(100), ID2.score2=rnorm(100))

library(dplyr)
library(stringr)
library(purrr)
现在只需在ID列上分组,并为每个ID拟合模型

fits <- stacked_dat %>%
  group_by(id) %>%
  do(model = lm(score1 ~ score2, data = .))

这是完全不同的。您可以根据名称为每个配对创建公式列表。然后在同一数据集上迭代每个公式

dat <- data.frame(ID1.score1=rnorm(100), ID1.score2=rnorm(100),ID2.score1=rnorm(100), ID2.score2=rnorm(100))

ids <- unique(sub("\\..*", "", names(dat)))
f <- lapply(paste0(ids, ".score2 ~ ", ids, ".score1"), as.formula)

models <- lapply(f, function(f) lm(f, dat))
然后,您可以提取模型列表,或者根据需要对其执行操作

model_coef <- sapply(models, coef)
colnames(model_coef) <- ids

model_coef

                    ID1         ID2
(Intercept) -0.07592376 -0.02472962
ID1.score1  -0.02284805  0.09144416

这是完全不同的。您可以根据名称为每个配对创建公式列表。然后在同一数据集上迭代每个公式

dat <- data.frame(ID1.score1=rnorm(100), ID1.score2=rnorm(100),ID2.score1=rnorm(100), ID2.score2=rnorm(100))

ids <- unique(sub("\\..*", "", names(dat)))
f <- lapply(paste0(ids, ".score2 ~ ", ids, ".score1"), as.formula)

models <- lapply(f, function(f) lm(f, dat))
然后,您可以提取模型列表,或者根据需要对其执行操作

model_coef <- sapply(models, coef)
colnames(model_coef) <- ids

model_coef

                    ID1         ID2
(Intercept) -0.07592376 -0.02472962
ID1.score1  -0.02284805  0.09144416

列的名称中是否有说明它们应该配对的内容?或者一个是X,另一个是Y?如果是这样的话,你可以利用这一点,让事情变得更干净。是的,只是用a,B,C。。这是一个很快的例子。实际数据帧具有按ID编号配对的列。所以第一列类似于1234.score1,第二列类似于1234..score2。第三列是5678.score1,第四列是5678.score2。列的名称中是否有说明它们应该配对的内容?或者一个是X,另一个是Y?如果是这样的话,你可以利用这一点,让事情变得更干净。是的,只是用a,B,C。。这是一个很快的例子。实际数据帧具有按ID编号配对的列。所以第一列类似于1234.score1,第二列类似于1234..score2。第三列是5678.score1,第四列是5678.score2这绝对让我走对了方向!如何在此基础上进行扩展,以便将每个摘要的绘图保存为jpeg格式?所以使用函数x,y{mod没有将jpeg引入函数,我只是在列表上使用了Lappy。谢谢你的建议!很高兴你自己解决了它!我也会这么做的。如果你有任何其他问题,请告诉我!这肯定让我走上了正确的方向!我如何扩展它以节省成本为每个摘要打印一个jpeg?因此,使用functionx,y{mod之类的函数而不是将jpeg放入函数中,我最终只是在列表上使用了Lappy。谢谢你的建议!很高兴你自己解决了它!我也会这样做。如果你有任何其他问题,请告诉我!
stacked_dat <- ids %>%
  map_dfr(~ {
    select(dat, starts_with(.)) %>%
      set_names(scores) %>%
      mutate(id = .x)})
fits <- stacked_dat %>%
  group_by(id) %>%
  do(model = lm(score1 ~ score2, data = .))
fits$model
dat <- data.frame(ID1.score1=rnorm(100), ID1.score2=rnorm(100),ID2.score1=rnorm(100), ID2.score2=rnorm(100))

ids <- unique(sub("\\..*", "", names(dat)))
f <- lapply(paste0(ids, ".score2 ~ ", ids, ".score1"), as.formula)

models <- lapply(f, function(f) lm(f, dat))
model_coef <- sapply(models, coef)
colnames(model_coef) <- ids

model_coef

                    ID1         ID2
(Intercept) -0.07592376 -0.02472962
ID1.score1  -0.02284805  0.09144416