r - 在数据帧中,R 如何将列减去其他 colums

  显示原文与译文双语对照的内容
88 3

我有一个由 1000行和 156列组成的数据框架。 我试图减去第一列到下列 38列,然后减去第 39列,但是我找不到方法。 我只使用 ncdf4,没有别的东西。 要做的这些工作如下批处理


C1 C2 C3 C4 C5 C6 C7 C8


1 2 3 4 5 6 4 5


3 4 6 5 4 3 2 7



我想让它成为


C1 C2 C3 C4 C5 C6 C7 C8


0 1 2 3 4 5 3 4


0 1 3 2 1 0 -1 4



逻辑将是第一个 38列- 第一列

列 39: 77 - 列 39

等等。

时间:

73 4

通过简单地做


{


 z[,1:38] <- z[,1:38]-z[,1]


 z[,39:77] <-z[,39:77]-z[,39]


 z[,78:118] <-z[,78:118]-z[,78]


 z[,119:156] <-z[,119:156]-z[,119]


}



其中z 是 dataframe 。 也许不是最好的方法但是它

69 1

你也可以在没有任何循环的情况下执行以下操作:


# sample data frame


df <- data.frame(matrix(data = seq(1,316),ncol = 158))



# split the data frame into list of data frame having columns


# 1 to 38, 39 to 77 and so on


df <- split.default(df, gl(round(ncol(df)/38),k = 38))



# subtract the last column from each


df <- do.call(cbind, lapply(df, function(f) f - f[,ncol(f)]))


colnames(df) <- paste0('C', seq(1,158))



print(head(df))



 C1 C2 C3 C4 C5


1 -74 -72 -70 -68 -66


2 -74 -72 -70 -68 -66



原作者:
60 3

以下是用户定义的函数: 如果需要的话,可以添加其他语句。


mydiff<-function(df){


 mydiff<-df


 for(i in 1:ncol(df)){


 if(i<=38){


 mydiff[,i]<-df[,i]-df[,1]


 }


 else if(i%in%c(39:77)){


 mydiff[,i]<-df[,i]-df[,39]


 }



 }



mydiff 


}



mydiff(df1)



输出:


 C1 C2 C3 C4 C5 C6 C7 C8


 0 1 2 3 4 5 3 4


 0 1 3 2 1 0 -1 4



基准:


system.time(result<-as.tibble(iris2) %>% 


 select_if(is.numeric) %>% 


 mydiff())



结果:


 user system elapsed 


 0.02 0.00 0.01 



130 0

你应该考虑使用 tidyverse 解决这个问题,将包装入 R 对你的环境的开销很少,这样可以使你的生活更加轻松。


 library(tidyverse)



> df %>% 


 mutate_at(.vars = vars(prefix = num_range('C', 1:38)),. funs = function(x) x -. $C1) %>% 


 mutate_at(.vars = vars(prefix = num_range('C', 39:77)),. funs = function(x) x -. $C39)



 C1 C2 C3 C4 C38 C39 C40 C41 C42 C77


1 0 1 2 3 4 0 1 2 3 4


2 0 0 3 2 4 0 0 3 2 4



数据


df <-


data.frame(


 C1 = c(1, 3),


 C2 = c(2, 3),


 C3 = c(3, 6),


 C4 = c(4, 5),


 C38 = c(5, 7),


 C39 = c(1, 3),


 C40 = c(2, 3),


 C41 = c(3, 6),


 C42 = c(4, 5),


 C77 = c(5, 7)


)



...