带条件的数据帧计算

时间:2018-01-19 08:31:44

标签: r dataframe conditional-statements

我有一个如下所述的数据框:

DF    Count Count2    %
A     100   0         0%
B     80    20(A-B)  20%
C     50    30(C-C)  37.5%
D     25    25(C-D)  50%

为此,我使用了以下代码:

df1 <- data.frame(matrix(nrow = 100))
df2 <- data.frame(matrix(nrow = 80))
df3 <- data.frame(matrix(nrow = 50))
df4 <- data.frame(matrix(nrow = 25))

df <- c('A', 'B', 'C', 'D')

count <- c(nrow(df1), nrow(df2), nrow(df3), nrow(df4))

count2 <- vector(mode="numeric", length = 4)

for(i in 1:4) {
  if(i == 1) {
    count2[i] <- 0
  } else {
    count2[i] <- count[i-1] - count[i]
  }
}

percentage <- vector(mode="numeric", length = 4)

for(i in 1:4) {
  if(i == 1) {
    percentage[i] <- 0
  } else {
    percentage[i] <- ((count[i-1] - count[i])/count[i-1]) * 100
  }
}

final_df <- data.frame(df, count, count2, percentage)

我想在B和C之间添加一个新行(比如说Z),为此我的count2公式将是(Count2(B)-Z)而不是(ZC)和百分比Count2(Z)/ Count2 (B)。

现在对于C count2以及百分比公式将是(B-C)而不是(Z-C)。

期望的输出:

DF    Count Count2            %
A     100   0                 0%
B     80    20(A-B)           20%
Z     15    5 (Count2(B)-Z)   Count2(Z)/Count2(B)
C     50    30(C-C)           37.5%
D     25    25(C-D)           50%

1 个答案:

答案 0 :(得分:0)

试试这个:

final_df[5,] <- final_df[4,]
final_df[4,] <- final_df[3,]
levels(final_df[,1]) <- c(levels(final_df[,1]), "Z")
final_df[3,1] <- "Z"
final_df[3,2:4] <- c(15,  final_df[2,3]-15, 100*(final_df[2,3]-15)/final_df[2,3])