【问题标题】:What is a dplyr equivalent for using which function?使用哪个函数的 dplyr 等效项是什么?
【发布时间】:2016-09-29 01:47:44
【问题描述】:

我有一个数据框 1:

df1<- structure(list(`gaugelist[1:20, ]` = c(1094000L, 1094000L, 1094000L, 
1100600L, 1100600L, 1100600L, 1100600L, 1100600L, 1100600L, 1100600L, 
1100600L, 1100600L, 1100600L, 1100600L, 1096000L, 1100600L, 1100600L, 
1100600L, 1100600L, 1100600L)), .Names = "gaugelist[1:20, ]", row.names = c(NA, 
-20L), class = "data.frame")

还有第二个列表:

df2 <- c("ts.01094000.crest.csv", "ts.01100600.crest.csv")

我想根据匹配的行值在 df1 中创建另一列:

df1$test <- apply(df1, 1, function(x) df2[which(grepl(x,df2))])
  1. dplyr 的工作方式是什么?我无法按行工作。
  2. 如果 df1 有大量列并且我只想根据相同的规则“测试”一个新列,我该如何进行这项工作。

【问题讨论】:

  • 似乎应该有一种聪明的方法来矢量化你正在尝试做的事情。嗯。

标签: r dplyr apply


【解决方案1】:

这对我有用:

df1 <- setNames(df1, "x") # rename column to `x` for brevity
df1 %>% rowwise() %>%
 mutate(test = df2[grep(x,df2)[1]])
# Source: local data frame [20 x 2]
# Groups: <by row>

# # A tibble: 20 × 2
#          x                  test
#      <int>                 <chr>
# 1  1094000 ts.01094000.crest.csv
# 2  1094000 ts.01094000.crest.csv
# 3  1094000 ts.01094000.crest.csv

解释。您没有解释为什么“无法按行工作”,但根据我自己的经验,您可能已经收到此消息

错误:大小不兼容 (0),需要 1(组大小)或 1

如果您在mutate 中使用类似df2[which(grepl(x,df2))] 的表达式,这是因为一个(或多个)返回值的长度为0(即在df2 中找不到匹配项)。使用mutate(test = df2[grep(x,df2)[1]]) 解决了这个问题。特别要注意df2[grep(x,df2)[1]] 返回一个且只有一个值。

【讨论】:

  • 谢谢。有用。如果 df1 有大量列并且 x 引用其中一列而不是唯一一列,这会起作用吗?
猜你喜欢
  • 2021-08-27
  • 2015-10-04
  • 2012-08-16
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多