如何根据R中的列创建(或函数)循环?

时间:2016-02-22 14:03:44

标签: r function for-loop

我有这个数据框df(A)

col1  col2 col3 col4  col5
2      5    6    3.2   7
3      4    5    6     9
NA     NA   11   10    12
NA     NA   NA   NA    4.5

我希望这种操作,基于列,一个例子:

A[,col1:col2]*5
A[,co3:col4]*6
A[,col5]*7

我需要使用循环for创建它,我尝试使用:

result<- matrix(ncol=5,nrow=4)

for (i in dim(A)[1]{
 for (j in dim(A)[2]{
   if(j >=1 & j <=2){
      result[i,j] <- A*5}
   if(j>2 & j <=4){
      result[i,j] <- A*6}
   if (j>4){
      result[i,j] <- A*7}

 }
}

但是R告诉我:

number of items to replace is not a multiple of replacement length

预期结果是矩阵result,其值df(A)乘以对应值,基于列数。 这个例子很简单,我的真实df(A)是最大的,操作更复杂。也可以使用function(A)

2 个答案:

答案 0 :(得分:3)

使用矩阵并利用向量回收(我们需要转置两次,因为矩阵按列填充)。

DF <- read.table(text = "col1  col2 col3 col4  col5
2      5    6    3.2   7
3      4    5    6     9
NA     NA   11   10    12
NA     NA   NA   NA    4.5", header = TRUE)

t(t(as.matrix(DF)) * c(5, 5, 6, 6, 7))
#     col1 col2 col3 col4 col5
#[1,]   10   25   36 19.2 49.0
#[2,]   15   20   30 36.0 63.0
#[3,]   NA   NA   66 60.0 84.0
#[4,]   NA   NA   NA   NA 31.5

答案 1 :(得分:0)

我们也可以

DF*c(5,5,6,6,7)[col(DF)]
#   col1 col2 col3 col4 col5
#1   10   25   36 19.2 49.0
#2   15   20   30 36.0 63.0
#3   NA   NA   66 60.0 84.0
#4   NA   NA   NA   NA 31.5

sweep

sweep(DF, 2, FUN="*", c(5, 5, 6, 6,7))