将行中的每个值除以r中列头中的相应值

时间:2016-10-06 20:46:58

标签: r

我需要将行中的值除以列标题中的相应值,然后得到每行的总和

我将这些数据作为csv文件:

df <-
  read.table(text =
"Year    2    3   4   5   6   7   8
 1985    0   4   0   4   0   0   0
 1986    1   3   3   0   9   7   6
 1987    5   0   0   0   0   0   8
 1988    7   2   0   8   0   3   0
 1989    0   0   0   1   0   2   0"
             , check.names = FALSE)

我正在寻找这个结果

Year    2   3   4   5   6   7   8     SUM
1985    0   1.3 0   0.8 0   0   0     2.13
1986    0.5 1  0.75 0  1.5  1  0.75   5.5
1987    2.5 0   0   0   0   0   1     3.5
1988    3.5 0.6 0   1.6 0   0.4 0     6.19
1989    0   0   0   0.2 0   0.2 0     0.49

然后我需要将结果保存为csv。

2 个答案:

答案 0 :(得分:0)

使用dplyr仅清理代码的一种方法是使用apply并将列名转换为数字。请注意,因为您将row.names更改为列(“YEAR”),我们需要单独处理它们。在这里,我通过使用df[ ,-1]删除该列然后在最后添加它来执行此操作(此处,使用mutate,但您也可以单独执行此操作)。

apply(df[,-1], 1, function(x){
  x / as.numeric(colnames(df)[-1])
}) %>%
  t %>%
  addmargins(2) %>%
  data.frame(check.names = FALSE) %>%
  mutate(YEAR = df$YEAR) %>%
  select(YEAR, everything())

或者,对于这个例子而言可能有些过分(但可能更广泛地有用)是使用tidyr转换为long first,这为控制和汇总提供了一些可能更灵活的选项:

df %>%
  gather(head, val, -YEAR) %>%
  mutate(divided = val / as.numeric(head)) %>%
  select(-val) %>%
  spread(head, divided) %>%
  mutate(Sum = rowSums(.[ , -1]))

两者都以大致相似的格式给出相同的值。

答案 1 :(得分:0)

您可以按如下方式有效实现这一目标:

m <- as.matrix(df[,-1])
m <- round(t(t(m)/m[1,]),2)
df[-1,-1] <- m[-1,]
df$SUM <- rowSums(df[,-1])

#    V1  V2   V3   V4  V5  V6   V7   V8   SUM
#1 Year 2.0 3.00 4.00 5.0 6.0 7.00 8.00 35.00
#2 1985 0.0 1.33 0.00 0.8 0.0 0.00 0.00  2.13
#3 1986 0.5 1.00 0.75 0.0 1.5 1.00 0.75  5.50
#4 1987 2.5 0.00 0.00 0.0 0.0 0.00 1.00  3.50
#5 1988 3.5 0.67 0.00 1.6 0.0 0.43 0.00  6.20
#6 1989 0.0 0.00 0.00 0.2 0.0 0.29 0.00  0.49

我们将df转换为矩阵m,以便从可以在矩阵中完成的矢量化操作中受益。这是做了什么:

  1. df转换为矩阵m(不包括第一列)
  2. 按行元素划分第一行
  3. m中的数据恢复为df
  4. df
  5. 中每行的计算总和

    以便将其保存为csv文件:

    write.csv(file=fileName, x=df)