我可以矢量化数据帧行之间的汉明距离计算吗?
Can I vectorise this hamming distance calculation between rows of a dataframe?
我有一个数据框,其中包含 2010 年至 2017 年员工的数据。我想为每一年和每一名员工计算行中数据与任意年份之间的汉明距离(例如不匹配的数量) , x.
test <- data.frame(
name = c("A", "A", "A", "A", "A", "A", "A", "A"),
year = seq(2010, 2017),
favourite_colour = sample(c("Blue",
"Green",
"Red"), 8, TRUE),
favourite_fruit = sample(c("Apple",
"Banana"), 8, TRUE)
)
例如对于员工 A,我想创建一个新列 distance,它给出员工 'favourite colour' 和 'favourite fruit' 之间的汉明距离,以及 2017 年的这些值。
我知道我可以通过创建一个单独的数据集来实现这一点,该数据集仅包含 2017 年的值,然后加入 - 然后我可以进行手动的逐列比较 - 但我有很多要比较的变量,似乎应该有更好的方法。
编辑澄清:
我的意思是,例如,如果行是:
2010/蓝色/苹果
2011/绿色/苹果
...
2017/绿色/香蕉
2010 年的距离分数应该是 2,因为蓝色和苹果都不符合它们在 2017 年各自的值。
2011 年的距离分数应为 1,因为蓝色与 2017 年的相应值不匹配,但绿色符合。
这个怎么样:
library(tidyverse)
set.seed(123)
test <- data.frame(
name = c("A", "A", "A", "A", "A", "A", "A", "A"),
year = seq(2010, 2017),
favourite_colour = sample(c("Blue",
"Green",
"Red"), 8, TRUE),
favourite_fruit = sample(c("Apple",
"Banana"), 8, TRUE)
)
test %>%
pivot_longer(favourite_colour:favourite_fruit, names_to="var", values_to="vals") %>%
group_by(name, var) %>%
mutate(comp = vals[which(year== 2017)]) %>%
ungroup() %>%
group_by(name, year) %>%
summarise(dist = sum(comp != vals))
#> `summarise()` has grouped output by 'name'. You can override using the
#> `.groups` argument.
#> # A tibble: 8 × 3
#> # Groups: name [1]
#> name year dist
#> <chr> <int> <int>
#> 1 A 2010 1
#> 2 A 2011 1
#> 3 A 2012 2
#> 4 A 2013 1
#> 5 A 2014 2
#> 6 A 2015 0
#> 7 A 2016 1
#> 8 A 2017 0
由 reprex package (v2.0.1)
创建于 2022-05-12
它不会给出完全相同的结果,因为没有随机数种子,我无法生成相同的数据,但这应该可行。
我有一个数据框,其中包含 2010 年至 2017 年员工的数据。我想为每一年和每一名员工计算行中数据与任意年份之间的汉明距离(例如不匹配的数量) , x.
test <- data.frame(
name = c("A", "A", "A", "A", "A", "A", "A", "A"),
year = seq(2010, 2017),
favourite_colour = sample(c("Blue",
"Green",
"Red"), 8, TRUE),
favourite_fruit = sample(c("Apple",
"Banana"), 8, TRUE)
)
例如对于员工 A,我想创建一个新列 distance,它给出员工 'favourite colour' 和 'favourite fruit' 之间的汉明距离,以及 2017 年的这些值。
我知道我可以通过创建一个单独的数据集来实现这一点,该数据集仅包含 2017 年的值,然后加入 - 然后我可以进行手动的逐列比较 - 但我有很多要比较的变量,似乎应该有更好的方法。
编辑澄清:
我的意思是,例如,如果行是:
2010/蓝色/苹果
2011/绿色/苹果
...
2017/绿色/香蕉
2010 年的距离分数应该是 2,因为蓝色和苹果都不符合它们在 2017 年各自的值。
2011 年的距离分数应为 1,因为蓝色与 2017 年的相应值不匹配,但绿色符合。
这个怎么样:
library(tidyverse)
set.seed(123)
test <- data.frame(
name = c("A", "A", "A", "A", "A", "A", "A", "A"),
year = seq(2010, 2017),
favourite_colour = sample(c("Blue",
"Green",
"Red"), 8, TRUE),
favourite_fruit = sample(c("Apple",
"Banana"), 8, TRUE)
)
test %>%
pivot_longer(favourite_colour:favourite_fruit, names_to="var", values_to="vals") %>%
group_by(name, var) %>%
mutate(comp = vals[which(year== 2017)]) %>%
ungroup() %>%
group_by(name, year) %>%
summarise(dist = sum(comp != vals))
#> `summarise()` has grouped output by 'name'. You can override using the
#> `.groups` argument.
#> # A tibble: 8 × 3
#> # Groups: name [1]
#> name year dist
#> <chr> <int> <int>
#> 1 A 2010 1
#> 2 A 2011 1
#> 3 A 2012 2
#> 4 A 2013 1
#> 5 A 2014 2
#> 6 A 2015 0
#> 7 A 2016 1
#> 8 A 2017 0
由 reprex package (v2.0.1)
创建于 2022-05-12它不会给出完全相同的结果,因为没有随机数种子,我无法生成相同的数据,但这应该可行。