如何通过R中的函数从所有列中减去第一列的值

时间:2018-07-25 08:34:23

标签: r function dataframe

我想知道如何创建一个函数以从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中的新手。

2 个答案:

答案 0 :(得分:0)

方法如下:

# 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

答案 1 :(得分:0)

谢谢大家提供不同的解决方案。 似乎最简单且仍然完美的工作是@DavidArenburg建议的:

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

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

谢谢!