当前位置: 首页 > 知识库问答 >
问题:

如何根据另一个数据帧中的值在数据帧中创建一个虚拟,该数据帧在R中具有不同的观察长度?

姚洲
2023-03-14

在R中,我有以下两个数据帧(Df1和Df2)——它们是我刚刚制作的例子——我打算根据以下规则创建一个虚拟变量:对于Df1中的每个id,如果这个观察id的年份更高或等于Df2中年份的观测id,则虚拟值为1,否则为0。数据帧Df3是我希望实现的结果。我怎么能做到呢?Df1

Df2

Df3

一些背景:

我尝试为我正在处理的真实数据帧创建两个循环。下面是我尝试过的代码。数据帧称为data_school,我的id、年和虚拟变量分别是id_escola、ano和internet_fixa。我做了我的两个初始数据帧之间的完全连接,结果我得到了data_school。因为它是多对一连接,所以我创建了虚拟变量,只有精确匹配的值等于1,其他都是NA。然后我继续做下面的循环,首先迭代所有id,获取每个id,虚拟的参考年份,然后迭代该id的每个唯一年份,并根据规则替换它。对于第一行,它工作得很好,但是在一些行之后,它会得到以下错误“如果(data_school[data_school$id_escola==id错误

for (id in unique(data_school$id_escola)) {
  current_subset <- subset(data_school, id_escola == id & is.na(internet_fixa) == F)
  year_implementation <- current_subset$ano
  current <- subset(data_school, id_escola == id)
  for (i in unique(current$ano)){
    if (data_school[data_school$id_escola == id & data_school$ano == i,]$ano < year_implementation) {
      data_school[data_school$id_escola == id & data_school$ano == i, "internet_fixa"] <- 0
    } else {
      data_school[data_school$id_escola == id & data_school$ano == i, "internet_fixa"] <- 1
    }
  }
}

附言:如果你愿意,如果最后一部分不够清楚,你可以忽略它(一些上下文)。

共有2个答案

严琨
2023-03-14

我们可以使用带有数据的连接。表

library(data.table)
setDT(df1)[df2, dummy := +(year >= i.year), on = .(id)]

-输出

> df1
   id year   x1 dummy
1:  1 2017 0.30     0
2:  1 2018 0.50     0
3:  1 2019 0.45     1
4:  1 2020 0.50     1
5:  1 2021 0.60     1
df1 <- structure(list(id = c(1L, 1L, 1L, 1L, 1L), year = 2017:2021, 
    x1 = c(0.3, 0.5, 0.45, 0.5, 0.6)), class = "data.frame", row.names = c(NA, 
-5L))

df2 <- structure(list(id = 1:2, year = 2019:2020),
 class = "data.frame", row.names = c(NA, 
-2L))
左华灿
2023-03-14

这是否工作:

library(dplyr)
df2 %>% rename('df2_year' = year) %>% left_join(df1, by = 'id') %>% group_by(id) %>% mutate(dummy = if_else(year >= df2_year, 1, 0)) %>% select(-df2_year)
# A tibble: 6 x 4
# Groups:   id [2]
     id  year    x1 dummy
  <int> <int> <dbl> <dbl>
1     1  2017  0.3      0
2     1  2018  0.5      0
3     1  2019  0.45     1
4     1  2020  0.5      1
5     1  2021  0.6      1
6     2    NA NA       NA

使用的数据:

df1
  id year   x1
1  1 2017 0.30
2  1 2018 0.50
3  1 2019 0.45
4  1 2020 0.50
5  1 2021 0.60
df2
  id year
1  1 2019
2  2 2020
  • 示例数据中的df1中缺少id=2
 类似资料:
  • 我正在改装一些现有代码以使用Spark。我有多个包含不同数据集的数据帧。在转换主数据帧(或主数据集)时,我需要使用来自其他数据帧的数据来完成转换。我还有一种情况(至少在当前结构中),我需要在另一个数据帧的转换函数中创建新的数据帧。 我试图确定以下内容: 我可以在另一个数据帧的转换函数中访问数据帧吗 关于如何处理这种情况的指针将非常有帮助。

  • 我有两个数据帧,它们的列名相同,但行数不同。第一个数据帧(a)看起来与此类似: 注:站点5、6、8和12故意丢失。 第二个数据帧(b)看起来像这样: 我想要实现的是: 在那里我注入(我肯定有一个更好的术语)数据帧b到数据帧a的数据,但是我想用零替换b中的任何NAs,并保持a中的NAs不变。 我发现并尝试了这个代码: 但它会带来NAs。我考虑先将NAs替换为零,但即使如此,它也会抹去我目前在数据帧a

  • 我相信这很简单,但找不到答案。我有一个数据帧df: 然后,我有另一个较小的数据框,其中包含单元格引用(行号和列号),引用df中应为空的特定单元格(即NA): 我如何用NA替换df中所有由cellRefs中的行和列引用引用的单元格?

  • 我有两个数据帧,它们共享多个公共列,如下所示: 第一个: 而第二个: 我想保留中的行,其列也存在于中。例如,df2的第27行有值,对于,这些值并不都存在于(因为df1只对列有值

  • 我得到了一个具有多个列和行的数据帧df1。简单的例子: 我想创建一个空的数据框df2,然后再添加新的列和计算结果。 此时,我的代码如下所示: …添加两个新列: 有没有更好/更安全/更快的方法?是否可以创建一个空数据帧df2,并且只从df1复制索引?

  • 我有两个Pandas Dataframe和,其中是的一部分,我想创建一个Dataframe,其中包含中的code>。 以下是一个例子: 注: 我的DataFrame可能有多个列,但是必须仅在列上进行匹配。