data.table::dcast long to wide data while ignoring NA-Category?
data.table::dcast long to wide data while ignoring NA-Category?
我想在一些连接后将我的数据从长数据转换为宽数据,从而在提供的数据中产生一些 NA
s。
不幸的是,这些 NA
也存在于 richt-hand 侧 (RHS),它定义了通过转换新添加的列。
考虑这个例子:
library(data.table)
dt <- data.table(id=c(1,2,1,2,3,4),
group = c("A","A","B","B",NA,NA),
values = c(7,8,9,10,NA,NA))
dt_wide <- dcast(dt,
id ~ group,
value.var = c("values"))
在数据中,第 5 行和第 6 行没有任何组或关联值:
id group values
1: 1 A 7
2: 2 A 8
3: 1 B 9
4: 2 B 10
5: 3 <NA> NA
6: 4 <NA> NA
如果有关联值,则组确实存在,因此:(group
== NA
) => (value
== NA
)
转换后的数据帧错误地将 NA
视为其在 group
- 列中的组,这导致以下宽数据 table:
id NA A B
1: 1 NA 7 9
2: 2 NA 8 10
3: 3 NA NA NA
4: 4 NA NA NA
我不希望构建一个可能存在错误的解决方法,在其中我按名称或值追溯删除 NA 列(因为它可能会在以后的生产中处理不同的列名和列)。
有没有办法告诉 dcast
忽略组中的 NA 并且不从中创建额外的列,同时保留转换后的所有行 table?
像这样:
id A B
1: 1 7 9
2: 2 8 10
3: 3 NA NA
4: 4 NA NA
我认为无法阻止 dcast
这样做。之后我会过滤掉它们:
dt_wide[, names(dt_wide) != "NA", with = FALSE]
输出:
id A B
1: 1 7 9
2: 2 8 10
3: 3 NA NA
4: 4 NA NA
这很棘手,但似乎可行:
dcast(dt,
id ~ ifelse(is.na(group),unique(na.omit(dt$group)),group),
value.var = c("values"))
Key: <id>
id A B
<num> <num> <num>
1: 1 7 9
2: 2 8 10
3: 3 NA NA
4: 4 NA NA
我想在一些连接后将我的数据从长数据转换为宽数据,从而在提供的数据中产生一些 NA
s。
不幸的是,这些 NA
也存在于 richt-hand 侧 (RHS),它定义了通过转换新添加的列。
考虑这个例子:
library(data.table)
dt <- data.table(id=c(1,2,1,2,3,4),
group = c("A","A","B","B",NA,NA),
values = c(7,8,9,10,NA,NA))
dt_wide <- dcast(dt,
id ~ group,
value.var = c("values"))
在数据中,第 5 行和第 6 行没有任何组或关联值:
id group values
1: 1 A 7
2: 2 A 8
3: 1 B 9
4: 2 B 10
5: 3 <NA> NA
6: 4 <NA> NA
如果有关联值,则组确实存在,因此:(group
== NA
) => (value
== NA
)
转换后的数据帧错误地将 NA
视为其在 group
- 列中的组,这导致以下宽数据 table:
id NA A B
1: 1 NA 7 9
2: 2 NA 8 10
3: 3 NA NA NA
4: 4 NA NA NA
我不希望构建一个可能存在错误的解决方法,在其中我按名称或值追溯删除 NA 列(因为它可能会在以后的生产中处理不同的列名和列)。
有没有办法告诉 dcast
忽略组中的 NA 并且不从中创建额外的列,同时保留转换后的所有行 table?
像这样:
id A B
1: 1 7 9
2: 2 8 10
3: 3 NA NA
4: 4 NA NA
我认为无法阻止 dcast
这样做。之后我会过滤掉它们:
dt_wide[, names(dt_wide) != "NA", with = FALSE]
输出:
id A B
1: 1 7 9
2: 2 8 10
3: 3 NA NA
4: 4 NA NA
这很棘手,但似乎可行:
dcast(dt,
id ~ ifelse(is.na(group),unique(na.omit(dt$group)),group),
value.var = c("values"))
Key: <id>
id A B
<num> <num> <num>
1: 1 7 9
2: 2 8 10
3: 3 NA NA
4: 4 NA NA