如何在数据帧中的其他列中减去一列

时间:2019-01-08 19:12:01

标签: r frame subtraction ncdf4

我有一个包含1000行和156列的数据框。我试图将第一列减去接下来的38列,然后将第39列减去之后的38列,依此类推,但是我找不到解决方法。我只使用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列

以此类推。

4 个答案:

答案 0 :(得分:0)

只需完成

即可解决
{
  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是数据帧。可能不是最好的方法,但是可以解决问题

答案 1 :(得分:0)

这是用户定义的函数:您可以根据需要添加else if语句。

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 

答案 2 :(得分:0)

您还可以无任何循环地执行以下操作:

# 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

答案 3 :(得分:0)

您应该考虑使用tidyverse来解决此问题,将程序包加载到R中对环境的开销几乎没有影响,并且可以使您的生活更加轻松。

 library(tidyverse)

> df %>% 
   mutate_at(.vars = vars(num_range(prefix = 'C', 1:38)), .funs = function(x) x - .$C1) %>% 
   mutate_at(.vars = vars(num_range(prefix = '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)
)