我有这个数据框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)
?
答案 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))