【问题标题】:Calculate function on a column of nested tibbles?计算嵌套小标题列上的函数?
【发布时间】:2018-06-24 22:39:11
【问题描述】:

我有一个带有一列小标题的数据框。 这是我的部分数据:

date        time        uuid                data
2018-06-23  18:25:24    0b27ea5fad61c99d    <tibble>    
2018-06-23  18:25:38    0b27ea5fad61c99d    <tibble>    
2018-06-23  18:26:01    0b27ea5fad61c99d    <tibble>    
2018-06-23  18:26:23    0b27ea5fad61c99d    <tibble>    
2018-06-23  18:26:37    0b27ea5fad61c99d    <tibble>    
2018-06-23  18:27:00    0b27ea5fad61c99d    <tibble>    
2018-06-23  18:27:22    0b27ea5fad61c99d    <tibble>    
2018-06-23  18:27:39    0b27ea5fad61c99d    <tibble>    
2018-06-23  18:28:06    0b27ea5fad61c99d    <tibble>    
2018-06-23  18:28:30    0b27ea5fad61c99d    <tibble>

这是我的功能:

jaccard <- function(vector1, vector2) {

  return(length(intersect(vector1, vector2)) / 
        length(union(vector1, vector2)))

}

我的数据列由带有一列字符的小标题组成:

contacts
5646
65748
115
498456
35135

我的目标是计算数据列中每 2 个连续 tibbles 之间的 jaccard。

我试过了:

df %&gt;% mutate(j = jaccard(data, lag(data, 1))) 但由于某种原因它似乎不起作用。

我知道我很接近,请指教。

【问题讨论】:

  • 解决方案没问题,但数字错误。我需要使用 [[]] 访问每个数据行并获取联系人列。 @mkr

标签: r dataframe tibble


【解决方案1】:

原因是jaccard 函数不是用来处理向量参数的。如您所知,用作mutate 一部分的函数接收数据向量(在OP 的示例中为10 tibbles 的向量)。现在,由于没有编写jaccard 函数来处理向量(小标题向量)的参数,因此结果将不符合预期。

最简单的解决方法是向量化jaccard 函数,以便它可以处理向量参数。曾经可以使用Vectorize转换函数为:

# Function 
jaccard <- function(vector1, vector2) {
  return(length(intersect(vector1, vector2)) / 
           length(union(vector1, vector2)))
}
# Vectorised version of jaccard function
jaccardV <- Vectorize(jaccard)


library(dplyr)
df %>%
  mutate(j = jaccardV(data, lag(data, 1)))

#          date     time             uuid                            data         j
# 1  2018-06-23 18:25:24 0b27ea5fad61c99d 5646, 65748, 115, 498456, 35135 0.0000000
# 2  2018-06-23 18:25:38 0b27ea5fad61c99d                     5646, 65748 0.4000000
# 3  2018-06-23 18:26:01 0b27ea5fad61c99d                5646, 65748, 115 0.6666667
# 4  2018-06-23 18:26:23 0b27ea5fad61c99d                            5646 0.3333333
# 5  2018-06-23 18:26:37 0b27ea5fad61c99d                     5646, 65748 0.5000000
# 6  2018-06-23 18:27:00 0b27ea5fad61c99d 5646, 65748, 115, 498456, 35135 0.4000000
# 7  2018-06-23 18:27:22 0b27ea5fad61c99d                     5646, 65748 0.4000000
# 8  2018-06-23 18:27:39 0b27ea5fad61c99d                5646, 65748, 115 0.6666667
# 9  2018-06-23 18:28:06 0b27ea5fad61c99d                            5646 0.3333333
# 10 2018-06-23 18:28:30 0b27ea5fad61c99d                     5646, 65748 0.5000000

数据:

df <- read.table(text="
date        time        uuid                
2018-06-23  18:25:24    0b27ea5fad61c99d    
2018-06-23  18:25:38    0b27ea5fad61c99d    
2018-06-23  18:26:01    0b27ea5fad61c99d    
2018-06-23  18:26:23    0b27ea5fad61c99d    
2018-06-23  18:26:37    0b27ea5fad61c99d    
2018-06-23  18:27:00    0b27ea5fad61c99d    
2018-06-23  18:27:22    0b27ea5fad61c99d    
2018-06-23  18:27:39    0b27ea5fad61c99d    
2018-06-23  18:28:06    0b27ea5fad61c99d    
2018-06-23  18:28:30    0b27ea5fad61c99d",
header = TRUE, stringsAsFactors = FALSE)

t1 <- tibble(contacts = c(5646,65748,115,498456,35135))
t2 <- tibble(contacts = c(5646,65748))
t3 <- tibble(contacts = c(5646,65748,115))
t4 <- tibble(contacts = c(5646))
t5 <- tibble(contacts = c(5646,65748))


df$data <- c(t1,t2,t3,t4,t5)

df
#          date     time             uuid                            data
# 1  2018-06-23 18:25:24 0b27ea5fad61c99d 5646, 65748, 115, 498456, 35135
# 2  2018-06-23 18:25:38 0b27ea5fad61c99d                     5646, 65748
# 3  2018-06-23 18:26:01 0b27ea5fad61c99d                5646, 65748, 115
# 4  2018-06-23 18:26:23 0b27ea5fad61c99d                            5646
# 5  2018-06-23 18:26:37 0b27ea5fad61c99d                     5646, 65748
# 6  2018-06-23 18:27:00 0b27ea5fad61c99d 5646, 65748, 115, 498456, 35135
# 7  2018-06-23 18:27:22 0b27ea5fad61c99d                     5646, 65748
# 8  2018-06-23 18:27:39 0b27ea5fad61c99d                5646, 65748, 115
# 9  2018-06-23 18:28:06 0b27ea5fad61c99d                            5646
# 10 2018-06-23 18:28:30 0b27ea5fad61c99d                     5646, 65748

【讨论】:

  • 仍然达不到预期...我得到0和1,而每2个小标题的jaccard不是0或1...
  • 解决方案没问题,但数字错误。我需要使用 [[]] 访问每个数据行并获取联系人列。 @mkr
  • @steves 你可以这样做。我认为如果您可以分享dput(head(df)) 的输出会更好。我也可以验证输出。还有一点。您在 jaccard 函数中使用了 length,但您应该使用 nrow,因为您的参数是 data.frame 或 tibble 请尝试使用 nrow 一次。
  • 它不适用于nrow 试过。对于联系人,您会看到一个示例 tibble 的头部,您可以使用一个类似的并尝试使用 2 行。对我来说,它不能满足我的需要。唯一可行的方法是,如果我使用 jaccard(df$data[[1]]$contacts, df$data[[2]]$contacts)) 运行 for 循环
  • 谢谢@mkr,我需要你的帮助,请指教。与此同时,我正在四处寻找如何解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多