我的数据形状非常简单:
set.seed(1337)
id <- c(1:4)
values <- runif(0, 1, n=4)
df <- data.frame(id, values)
df
id values
1 1 0.57632155
2 2 0.56474213
3 3 0.07399023
4 4 0.45386562
这并不简单:我有一个与每一行匹配的字符值数组列表,每个列表项可以为空,或者可以包含多达5个单独的标签,例如...
tags <- list(
c("A"),
NA,
c("A", "B", "C"),
c("B", "C")
)
使用标签作为分类器时,我将被问到各种问题,例如,“带有B标签的所有行的平均值是多少?”或“多少行同时包含标签A和标签C?”
您会选择哪种方式存储标签,以便我可以这样做?我的现实数据文件非常大,这使得尝试unlist
或其他命令变得困难。
答案 0 :(得分:1)
那不是很难。您只需要将您的列表分配给df创建一个新列作为名称标签,然后我们进行unnest
,我就列出了您列出的问题的解决方案。
library(tidyr)
library(dplyr)
df$tags=list(
c("A"),
NA,
c("A", "B", "C"),
c("B", "C")
)
Newdf=df%>%tidyr::unnest(tags)
Q1.
Newdf%>%group_by(tags)%>%summarise(Mean=mean(values))%>%filter(tags=='B')
tags Mean
<chr> <dbl>
1 B 0.263927925960161
Q2.
Newdf%>%group_by(id)%>%dplyr::summarise(Count=any(tags=='A')&any(tags=='C'))
# A tibble: 4 x 2
id Count
<int> <lgl>
1 1 FALSE
2 2 NA
3 3 TRUE
4 4 FALSE
答案 1 :(得分:1)
以下是获得预期输出的几个选项。在数据集中创建{tags}作为list
列和unnest
(已经从注释中创建),然后通过获取{{ 1}}的逻辑向量。同样,“ {values”的summarise
,其中“标记”为“ B”
sum