【问题标题】:compare common values in list with unequal sublist elements将列表中的常见值与不相等的子列表元素进行比较
【发布时间】:2019-10-24 07:41:52
【问题描述】:

我有一个这样的小标题:

library(tidyverse)

df <- tibble(
    id = 1:3,
    names = c("George G|Nick N", "Nick N|Andrian A", "Era E")

)

names 列的名称长度不等。

我想提取这些名称并比较是否有任何常用名称。

提取:

df_names <- (lapply(df$names, function(x) {strsplit(x, split="|", fixed = TRUE)}))

现在,我不确定如何进行比较。

我尝试了类似的方法:

maxlength <- max(sapply(df_names, length))
lapply(seq(maxlength),function(i) Reduce(intersect, lapply(df_names,"[[",i)))

但返回一个空字符列表。

我的意思是通用名称,我们可以看到df_names[[1]]df_names[[2]] 具有通用名称Nick N

然后,例如,我可以按 id 分组并绘制 id 与常用名称,以查看哪些 id 具有常用名称。

示例图:

【问题讨论】:

  • 您能否详细说明“常用名称”的含义?你的意思是在条目之间?你能说明想要的结果是什么样的吗?
  • @RomanLuštrik:嗨,我更新了帖子。我不确定确切的最终结果,就像我在帖子中所说的那样,只能在情节中显示。
  • 如果您像这样重新格式化您的数据,您的生活会更轻松:df %&gt;% mutate(names = strsplit(names, "|", fixed = TRUE)) %&gt;% tidyr::unnest(names)

标签: r dplyr tidyverse


【解决方案1】:

您可以构造一个矩阵,其中的单元格显示 id 之间存在通用名称。

例如:

library(proxy)
df <- df %>% mutate(sep_names = strsplit(names, split="|", fixed = TRUE))

res <- proxy::dist(df$sep_names, method = function(x, y) any(x %in% y))

# Convert to matrix and assign ids
res <- as.matrix(res)
colnames(res) <- df$id
rownames(res) <- df$id

# > res == 1
#       1     2     3
# 1 FALSE  TRUE FALSE
# 2  TRUE FALSE FALSE
# 3 FALSE FALSE FALSE

至于绘图,你可以从这里开始:

library(reshape2)
ggplot(melt(res == 1), aes(Var1,Var2, fill=value)) +
    geom_raster() +
    scale_fill_discrete() +
    xlab("id") + ylab("id")

【讨论】:

  • 然后如何绘制常用名称与 id?
  • 在图中,在 y 轴我想显示名称,而不是假/真值
  • 好的,你能解释清楚一点吗?在 x 轴上,我们有 id。 y轴呢?它应该包含所有可能的名称吗?如果是这样,每个单元格都应该描述该名称是否存在于相应的 id 中并且同时与任何其他 id 相同?
  • 在 x 轴上我们有 ids,y 轴将只包含常用名称。因此,在我们的例子中,x 轴将包含 id 1 和 2,y 轴将包含 Nick N。我希望清楚,谢谢!
  • 对不起,您的解释不清楚。您描述了 x 轴上的两个点和 y 轴上的一个点。如何表明它们是连接的(有一个共同的名称)?那么,其他点呢。你能描述一个有 3 个 id 的情况的图表,当它们都有共同的名字并且这些名字不同时? IE。例如,1 与 3 有共同的Nik,3 与 2 有共同的 'Ben',1 与 2 有共同的 'George'?
猜你喜欢
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
相关资源
最近更新 更多