【问题标题】:How to subtract values of a first column from all columns by function in R如何通过R中的函数从所有列中减去第一列的值
【发布时间】:2018-07-25 18:18:26
【问题描述】:

我想知道如何创建一个函数来从 A02、A03 等列中减去 A01 列中的值。

示例数据框:

   A01 A02 A03 A04 A05 (...)
1  158 297 326 354 357
2  252 131 341 424 244
3 ...
4 ...

例如,我可以手动减去每一列:

sampledata[1]-sampledata[1]
sampledata[2]-sampledata[1]
sampledata[3]-sampledata[1]
sampledata[4]-sampledata[1]  ... etc.

但是如何为每一列做一个很好的计算呢?结果我想有这个:

   A01 A02 A03 A04 A05 (...)
1  0   139 168 196 199
2  0  -121 89  171 -8
3 ...
4 ...

减法后,如果某个值是负数,那么我想将它转换为零。

我认为我的问题很容易解决,但我是 R 的新手。

【问题讨论】:

  • 欢迎来到 SO!你试过sweep()这个功能吗? x <- matrix(1:12, 3); sweep(x, 1, STATS = x[,1])
  • 或者只是sampledata - sampledata[[1]]。它将按列回收。
  • (sampledata - sampledata[,1]) * (sampledata > sampledata[,1]) 将负数转换为零
  • 谢谢@jogo,这个功能我没试过,但是看起来很有帮助。
  • 目前最简单最好的解决方案是@mt1022建议的,谢谢!

标签: r function dataframe


【解决方案1】:

感谢大家提供不同的解决方案。 似乎@DavidArenburg 建议的最简单且仍然可以正常工作的方法:

new_sample_data = (sampledata - sampledata[,1]) * (sampledata > sampledata[,1])

它在一个公式中进行两次转换(减去第一列,并将负数转换为零)。

谢谢!

【讨论】:

    【解决方案2】:

    方法如下:

    # Your data
    A01 <- c(158, 252)
    A02 <- c(297, 131)
    A03 <- c(326, 341)
    A04 <- c(354, 424)
    A05 <- c(357, 244)
    
    df <-  data.frame(A01, A02, A03, A04, A05, stringsAsFactors = FALSE)
    df
    
    # Define the function
    f_minus <- function(first_col, other_col) {
    
      other_col - first_col
    
    }
    
    df_output <- as.data.frame(matrix(ncol=ncol(df), nrow=nrow(df))) 
    
    for (i in 1:ncol(df)) {
    
      df_output[,c(i)] <- f_minus(df[,1], df[,i])
    
    }
    
    df_output
    
    # V1   V2  V3  V4  V5
    # 1  0  139 168 196 199
    # 2  0 -121  89 172  -8
    

    【讨论】:

    • 那么为什么不直接df - df[,1]
    • @DavidArenburg 说你的解决方案更优雅是轻描淡写的。虽然我最初认为需要一个函数。
    猜你喜欢
    • 2018-07-21
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多