我需要将行中的值除以列标题中的相应值,然后得到每行的总和
我将这些数据作为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。
答案 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
,以便从可以在矩阵中完成的矢量化操作中受益。这是做了什么:
df
转换为矩阵m
(不包括第一列)m
中的数据恢复为df
df
以便将其保存为csv
文件:
write.csv(file=fileName, x=df)