2016-09-29 62 views
0

我有一个数据帧1:什么是使用哪个函数的dplyr等价物?

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的列数很多,我只需要根据相同的规则创建一个新的“测试”列,我该如何做到这一点。
+0

似乎应该有一个聪明的方法来矢量化你想要做的事情。嗯。 – Chrisss

回答

2

这为我工作:

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 

解释。你没有解释你为什么“不能让横行的工作”,但根据我自己的经验,你可能会,如果你在mutate使用像df2[which(grepl(x,df2))]表达了此邮件

Error: incompatible size (0), expecting 1 (the group size) or 1

,这是因为一个(或更多)返回值的长度为0(即在df2中找不到匹配项)。使用mutate(test = df2[grep(x,df2)[1]])可解决此问题。尤其要注意的是,df2[grep(x,df2)[1]]只返回一个值。

+0

谢谢。有用。如果df1有大量的列,x是指其中一列而不是唯一的列,这会工作吗? – maximusdooku

+0

完美!它现在有效 – maximusdooku

相关问题