2016-09-29 65 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

相關問題