【发布时间】:2016-07-01 19:28:12
【问题描述】:
我有两个数据框。下面给出了可重现的例子:
structure(list(`1` = c(0L, 1L, 1L), `2` = c(1L, 0L, -1L), `3` = c(0L,
0L, 0L), `4` = c(0L, 0L, 0L), `5` = c(0L, 0L, 0L), `6` = c(0L,
0L, 0L), `7` = c(0L, -1L, 0L), `8` = c(0L, 0L, 0L), `9` = c(0L,
0L, 0L), `10` = c(0L, 0L, 0L), `11` = c(0L, 0L, 0L), `12` = c(0L,
0L, 0L), `13` = c(0L, 0L, 0L), `14` = c(0L, 0L, 0L), `15` = c(0L,
0L, 0L), `16` = c(0L, 0L, 0L), `17` = c(0L, 0L, 0L), `18` = c(0L,
0L, 0L), `19` = c(0L, 0L, 0L), `20` = c(0L, 0L, 0L), `21` = c(0L,
0L, 0L), `22` = c(0L, 0L, 0L), `23` = c(0L, 0L, 0L), `24` = c(-1L,
0L, 0L)), .Names = c("1", "2", "3", "4", "5", "6", "7", "8",
"9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
"20", "21", "22", "23", "24"), row.names = c(3L, 6L, 12L), class = "data.frame")
这有 24 列,每列代表语句。第二个数据框如下:
structure(list(Level = c(1L, 1L, 1L, 1L), Statement = c("attr1",
"attr2", "attr24", "attr7"), StmtNo = c(1L, 2L, 24L, 7L)), .Names = c("Level",
"Statement", "StmtNo"), row.names = c(NA, 4L), class = "data.frame")
第二个数据框有一列名为 StmtNo。这是 df1 中列的对应编号。例如,DF2 中的 StmtNo 1,与 DF1 的第 1 列匹配。
我想做的是:
对于 DF1 中值为 0 的所有单元格,我必须将 DF1 中的列号与 DF2 的 StmtNo 列匹配。如果列号匹配,则单元格值应为 0,如果不匹配,则值应为 NA。我尝试将 apply 与 if 条件一起使用:
df1 <- apply(df1, function(x) if (x == 0) {
if (exists(colnames(df1)) %in% df2$StmtNo) {
x == NA
} else {
x == 0
}
})
但这会返回一个逻辑列表。我想要的输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
3 0 1 NA NA NA NA 0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA -1
6 1 0 NA NA NA NA -1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 0
12 1 -1 NA NA NA NA 0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 0
虽然以上在填写 NA 方面可能看起来很统一,但我有 60 个这样的文件,每个文件都有需要填写 NA 的不同列。
【问题讨论】:
-
你的意思是
StmtNo列中的所有值都应该保持在df1中,如果零应该更改为NA,则其余的值? -
否,df2$StmtNo 中的值与 df1 中的列号匹配。因此,如果特定列的 DF1 中的单元格值为零,那么我需要检查该特定列号是否在 df2$StmtNo 中可用。如果它可用,那么我必须将其保留为零,如果它不可用,则我需要将其更改为 NA。我给出的期望输出在 DF1 中的第 3 列具有 NA。这意味着 df2$StmtNo 中没有 3。
-
是的,
df2$StmtNo的值是 1、2、24、7,这些列在df1中保留了它们的值,其余的都转换为NA