我有一个像这样的数据框:
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
答案 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")