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

等等。

时间:原作者:0个回答

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)
)
原作者:
...