如何在某些条件下基于其他两个数据帧填充数据帧?

时间:2019-05-16 07:31:40

标签: r dataframe

所以我正在处理两个数据框,我想创建一个新的数据框,以收集和汇总这两个数据框内的数据。

我过去常常通过循环来实现这一点,但效果很好,但是问题是,当数据帧很大时,它会花费一些时间,所以我想知道如果可能且更快的话,不使用循环就可以实现该目标

这是我为避免循环而使用的代码,但我需要执行其他一些步骤才能获得预期的结果。

df2 <- data.frame("S" = c("M", "M", "SE", "SI", "V", "M"),
                  "C" = c(300, 400, 400, 500, 600, 1000),
                  "F" = c("F1", "F2", "F3", "F2", "F4", "F5"),
                  "M" = c("M1", "M2", "M1", "M2", "M3", "M1"), stringsAsFactors = FALSE)

df3 <- data.frame("S" = c("M", "SE", "SI"),
                  "C" = c(3000, 4000, 5000),
                  "F" = c("F1", "F2", "F3"),
                  "M" = c("M1", "M2", "M3"), stringsAsFactors = FALSE)

df <- data.frame(F = sort(unlist(unique(df2$M))))

a <- df2 %>% group_by(M) %>% summarise(C = sum(C))
a <- as.data.frame(a)
a <- a[order(a$M),]
b <- df3 %>% group_by(M) %>% summarise(C = sum(C))
b <- as.data.frame(b)
b <- b[order(b$M),]

df$M <- NA
df$SE <- NA
df$SI <- NA
df$V <- NA
df$T <- a$C
df$T2 <- b$C
df$T3 <- df$T / 3 * 12
df$T4 <- ((df$T3 / df$T2) - 1) * 100
df <- df[order(df$T, decreasing = TRUE),]

所以df是我目前拥有的一个例子,现在我想拥有这样的东西:

df4 <- data.frame("F" = c("M1", "F5", "F3", "F1", "M2", "F2", "M3", "F4"),
                  "M" = c(1300, 1000, 0, 300, 400, 400, 0, 0),
                  "SE" = c(400, 0, 400, 0, 0, 0, 0, 0),
                  "SI" = c(0, 0, 0, 0, 500, 500, 0, 0),
                  "V" = c(0, 0, 0, 0, 0, 0, 600, 600),
                  "T" = c(1700, 1000, 400, 300, 900, 900, 600, 600),
                  "T2" = c(3000, 0, 0, 3000, 4000, 4000, 5000, 5000),
                  "T3" = 0,
                  "T4" = 0,
                  "R" = NA, stringsAsFactors = FALSE)

df4$T3 <- df4$T / 3 * 12
df4$T4 <- ((df4$T3 / df4$T2) - 1) * 100
df4[c(2, 3), "T4"] <- 100

只是为了说明这只是一个示例,我在此示例中显示的数据并不是我真正使用的数据,例如,我的意思是不必认为“ M”列必须具有诸如“ M1”的数据“,” M2“,” M3“ ...” MX“,但数据可以是” abc“之类的。

0 个答案:

没有答案