检查列名是否出现在数据框列表中的特定数据框中

时间:2018-01-15 11:21:52

标签: r list dataframe

我有一个像这样的数据框:

df <- data.frame(c(1, 2), NA, NA, NA)
colnames(df) <- c("id", "2017-01-01", "2017-02-01", "2017-03-01")

这样的数据框列表:

id_list <- list(data.frame(id = c(1, 1), date = c("2017-03-01", "2017-01-01")),
                data.frame(id = c(2, 2), date = c("2017-02-01", "2017-03-01")))

我的目标是使用0和1来填充df的日期列,具体取决于id_list是否在id的数据框中出现日期。因此,最终输出应为:

> df_final
  id 2017-01-01 2017-02-01 2017-03-01
1  1          1          0          1
2  2          0          1          1

实际上,df有170列和2400行; id_list有2400个数据框,每个数据框有1到100行和20列。我应该强调id_list中的数据框不按日期排序。

编辑:我刚试过LAP的解决方案:

df <- data.frame(c(1, 2), 0, 0, 0, 0)
colnames(df) <- c("id", "2017-01-01", "2017-02-01", "2017-03-01", "2017-04-01")
id_list <- list(data.frame(id = c(1, 1),
                           date = c("2017-03-01", "2017-01-01"),
                           stringsAsFactors = F),
                data.frame(id = c(2, 2, 2),
                           date = c("2017-02-01", "2017-03-01", "2017-04-1"),
                           stringsAsFactors = F))

不幸的是,输出是

> df
  id 2017-01-01 2017-02-01 2017-03-01 2017-04-01
1  1          1          0          1          0
2  2          0          1          1          0

而不是

> df
  id 2017-01-01 2017-02-01 2017-03-01 2017-04-01
1  1          1          0          1          0
2  2          0          1          1          1

EDIT2:我的拼写错误2017-04-1而不是2017-04-01

2 个答案:

答案 0 :(得分:2)

您可以在列上使用for循环,同时使用列名作为sapply调用的输入来循环遍历id_list并检查在for(i in names(df)[-1]){ df[, i] <- as.numeric(sapply(id_list, function(x) i %in% x[, "date"])) } > df id 2017-01-01 2017-02-01 2017-03-01 1 1 1 0 1 2 2 0 1 1 内是否出现了所述名称dataframes:

#blue {
  position: absolute;
  top: 0;
  left: 0;
  width: 200px;
  height: 200px;
  font-size: 16px;
  cursor: pointer;
  background-color: blue;
  z-index: 0;
}

#blue:hover {
  background: red;
}

#green {
  position: absolute;
  z-index: 1;
  -webkit-clip-path: polygon(0% 0%, 0% 100%, 25% 100%, 25% 25%, 75% 25%, 75% 75%, 22% 75%, 23% 100%, 100% 100%, 100% 0%);
  clip-path: polygon(0% 0%, 0% 100%, 25% 100%, 25% 25%, 75% 25%, 75% 75%, 22% 75%, 23% 100%, 100% 100%, 100% 0%);
}

答案 1 :(得分:1)

另一个选项是rbind'id_list',然后使用row/column索引方法分配1个值。如果其他值应为0,则最好使用0而不是NA构造

d1 <- do.call(rbind, id_list)
i1 <- cbind(match(d1$id, df$id), match(d1$date, names(df)[-1], nomatch = 0))
df[-1][i1] <- 1
df
#   id 2017-01-01 2017-02-01 2017-03-01
#1  1          1          0          1
#2  2          0          1          1

数据

df <- data.frame(c(1, 2), 0, 0, 0)
colnames(df) <- c("id", "2017-01-01", "2017-02-01", "2017-03-01")