因此,我试图将我的dplyr转换为DT,以加快处理时间,但我无法转换我的ifelse(any(startsWith...对DT的声明无论我尝试什么,它总是做一个极端或另一个极端,或者对于“Tag”的情况,它只是说它不存在。也许问题出在rowwise,但我想不出来。先谢谢你了!
下面是我的dplyr代码:
df <- df %>%
rowwise() %>%
mutate(
'Position' = coalesce(
ifelse(any(c_across(starts_with("Tag")) == "goalkeeper"), "Goalkeeper", NA),
ifelse(any(c_across(starts_with("Tag")) == "striker"), "Striker", NA),
),
Favorite = ifelse(any(c_across(starts_with("Tag")) == "favorite"), TRUE, FALSE),
across(starts_with("Tag"), ~ifelse(. %in% c("goalkeeper", "striker", "favorite"), NA_character_, .))
)
我的DT尝试
df[, `Position` := coalesce(
ifelse(any(startsWith(Tag, "goalkeeper")), "Goalkeeper", NA_character_), #tried this
ifelse(grepl("striker", "^Tag"), "Striker", NA_character_), #and this
)]
df[, Favorite := any(startsWith(Tag1, "favorite"))]
df[, (grep("Tag", names(df), value = TRUE)) :=
lapply(.SD, function(x) ifelse(x %in% c("goalkeeper", "striker", "favorite"), NA_character_, x)),
.SDcols = patterns("Tag")]
数据:
| 姓名|标签1|标签2|标签3|
| - -----|- -----|- -----|- -----|
| 一个|守门员|不适用|不适用|
| B|不适用|撞针|最喜欢的|
预期输出:
| 姓名|位置|最新资讯|
| - -----|- -----|- -----|
| 一个|守门员|假的|
| B|前锋|真|
2条答案
按热度按时间tvz2xvvm1#
应用函数
tidyData
查找每行的位置/收藏夹。要在行上执行此操作,请使用transpose
。第二个transpose
是以2列的形式获取所需的数据。数据:
ovfsdjhp2#
由于您正在按行方式创建多列快照,我不知道是否有很好的方法来实现这一点,但也许这就足够了?
(And您可以轻松地删除标签。)
使用
apply
的成本有点高,因为它会导致帧(.SD
,在本例中只是Tag#
列)在内部转换为matrix
。正是因为这个对话,在框架行上下文中使用apply
可能会很昂贵,这是理所当然的。另一种选择:
这两个执行速度有点相同(
median
,itr/sec
),但第一个具有较低的mem_alloc
,* 也许 * 表明它可能更适合更大的数据。但不要过于草率地对标小数据...扩展到一个更大的数据集,
我们得到了这些基准测试结果:
mem_alloc
对于第二种实现(Map
)来说要低一些,尽管median
和itr/sec
稍微慢一些。我不知道你的情况下哪个更好。