R语言 在循环中提取观测值,并计算每次迭代的平均值

vpfxa7rd  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(105)

我有两个 Dataframe ,我需要根据匹配检查从中提取变量。不幸的是,仅仅使用dplyr过滤似乎不起作用,因为第二个 Dataframe 是在一个更大的数据集上循环创建的,迭代了55年。对于每一年,我都需要A和B的值,以及C和D作为标识。目标是最终获得A和B的年平均值。
我尝试在循环中使用if语句,如果任何一个检查通过,该语句应该返回true,并随后将值提取到新对象中。我收到以下错误:条件具有长度〉1。
if ((df1$C %in% df2$C) | (df1$D %in% df2$D)) { [...] }
提前感谢,我很感激任何指针,因为我似乎无法找出一种方法,而不是手动计算每一步!情况概述如下:
df 1)与相关变量(A,B)和身份检查(C,D)
| 变量A|瓦尔B|检查C|检查D|
| --------------|--------------|--------------|--------------|
| a1|b1|C1|d1|
| a2|b2|c0|d0|
| A3|B3|C3|d0|
df 2)在特定年份观察身份检查(C,D)
| 检查C|检查D|
| --------------|--------------|
| C1|d1|
| C2|d2|
| C3|d3|
第一步:
我想提取每行的变量A和B,这取决于两个身份检查是否匹配。这意味着在上面的示例中,a1/b1将被提取为两个检查匹配,a3/b3将被提取为检查D匹配,而a2/b2将不被考虑,因为两个检查都不匹配。
生成的 Dataframe 将仅包括以下内容
| 变量A|瓦尔B|检查C|检查D|
| --------------|--------------|--------------|--------------|
| a1|b1|C1|d1|
| A3|B3|C3|d0|
第二步:
最终目标是,每个变量的年平均值是这样的
| 平均值A|平均值B|
| --------------|--------------|
| m1a|m1b|
| m2a|m2b|

kmbjn2e3

kmbjn2e31#

如果不知道你的数据是什么样子,很难回答这个问题。但是,如果df1df2有相同的行数,并且df1中的每一行都对应于df2中的每一行(即,df1中的第1行= df2中的第1行),那么你可以使用一个循环:

# Initialise df3 and it has the same number of columns as df1
df3 <- data.frame(matrix(nrow = 0, ncol = ncol(df1)))
colnames(df3) <- colnames(df1)

for (i in 1:nrow(df1)) {
  # If the Check Cs match OR the Check Ds match
  if (df1$`Check C`[i] == df2$`Check C`[i] | df1$`Check D`[i] == df2$`Check D`[i]) {
    # If at least one match is TRUE, add row to df3
    df3 <- rbind(df3, df1[i, ])
  }
}

然后,如果你在df1和(现在)df3中有一个year列,你可以使用tidyverse函数:

library("tidyverse")

df4 <- df3 %>% 
  group_by(year_column) %>% 
  summarise(`Mean A` = mean(`Var A`, na.rm = TRUE), 
            `Mean B` = mean(`Var B`, na.rm = TRUE))

或者,您可以从一开始就使用tidyverse函数,首先组合两个 Dataframe 。这看起来像这样:

# Have to change the common column names some how
colnames(df1) <- paste0(colnames(df1), "_1")
colnames(df2) <- paste0(colnames(df2), "_2")

df4 <- cbind(df1, df2) %>% 
  # Keep where at least one matches
  filter(`Check C_1` == `Check C_2` | `Check D_1` == `Check D_2`) %>% 
  # Keep df1 columns
  select(`Var A_1`, `Var B_1`, `Check C_1`, `Check D_1`) %>% 
  # Rename to match original
  rename(`Check C` = `Check C_1`, 
         `Check D` = `Check D_1`)

然后你可以像上面那样计算年平均值。

相关问题