将函数应用于R中的每两列
是否有方法对数据帧中的每两列使用apply函数?如果我有数据框将函数应用于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
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