我有一个较大的小标题(称为df.tbl
,具有〜26k行和22列),我想找到每个对象的“孪生”,即,在列2:7中具有相同值的每一行(日期:Pos)。
如果我使用:
inner_join(df.tbl, ~ df.tbl[i,], by = c("date", "forge", "serNum", "PinMain", "PinMainNumber", "Pos"))
i
是我要检查“双胞胎”的行,一切按预期进行,吐出2 x 22的小标题,我可以使用以下方法扩展它:
x <- NULL
for (i in 1:nrow(df.tbl)) {
x[[i]] <- as_vector(inner_join(df.tbl[,],
df.tbl[i,],
by = c("date",
"forge",
"serNum",
"PinMain",
"PinMainNumber",
"Pos")) %>%
select(rowNum.x)
}
创建一个列表,其中包含每个对象(行)的每个双胞胎的行号。
我无法使用map
来产生类似的结果:
twins <- map(df.tbl, ~ inner_join(df.tbl,
.,
by = c("date",
"forge",
"serNum",
"PinMain",
"PinMainNumber",
"Pos")) %>%
select(rowNum.x) )
我得到的只是以下错误:
Error in UseMethod("tbl_vars") : no applicable method for 'tbl_vars' applied to an object of class "c('double', 'numeric')"
如何使用for
将map
循环转换为等效循环?
我的原始数据如下:
>head(df.tbl, 3)
# A tibble: 3 x 22
rowNum date forge serNum PinMain PinMainNumber Pos FrontBack flow Sharped SV OP max min mean
<dbl> <date> <chr> <fct> <fct> <fct> <fct> <fct> <chr> <fct> <fct> <chr> <dbl> <dbl> <dbl>
1 1 2017-10-18 NA 179 Pin 1 W F NA 3 36237 235 77.7 55.3 64.7
2 2 2017-10-18 NA 179 Pin 2 W F NA 3 36237 235 77.5 52.1 67.4
3 3 2017-10-18 NA 179 Pin 3 W F NA 3 36237 235 79.5 58.6 69.0
# ... with 7 more variables: median <dbl>, sd <dbl>, Round2 <dbl>, Round4 <dbl>, OrigData <list>, dataSize <int>,
# fileName <chr>
,我想要一个长度与nrow(df.tbl)相同的列表,如下所示:
> twins
[[1]]
[1] 1 7
[[2]]
[1] 2 8
[[3]]
[1] 3 9
几乎所有对象都具有一个双胞胎/重复项(如上所述),但是少数对象具有两个或什至三个重复项(如上所述),即列2:7相同)
答案 0 :(得分:0)
您真的需要用map
解决吗?
我可以通过将duplicated
软件包中的semi_join
和dplyr
组合在一起来解决
defining_columns <- c("date", "forge", "serNum", "PinMain", "PinMainNumber", "Pos")
dplyr::semi_join(
df.tbl,
df.tbl[duplicated(df.tbl[defining_columns]),],
by = defining_columns
) %>%
group_by_at(defining_columns) %>%
arrange(.by_group = TRUE) %>%
summarise(twins = paste0(rowNum,collapse = ",")) %>%
pull(twins) %>%
strsplit(",")
duplicated
向我们提供了哪些行是重复的,而semi_join
仅保留了x
中存在的y
中的行
希望这会有所帮助!
答案 1 :(得分:0)
参加聚会有点晚,但是您可以使用nest()
来更整洁地做到这一点。
tbl.df1 <- tbl.df %>% group_by(date, forge, serNum, PinMain, PinMainNumber, Pos) %>% nest(rowNum)
双胞胎将出现在nest
创建的小玩意列表中。
tbl.df1$data
# [[1]]
# A tibble: 2 x 1
# rowNum
# <dbl>
# 1 1
# 2 7
#[[2]]
# A tibble: 2 x 1
# rowNum
# <dbl>
# 1 2
# 2 8
# etc