我正在尝试在我的tibble中创建一个新列,它收集并格式化所有其他列中找到的所有单词。如果可能的话,我想使用dplyr来做这件事。 原始DataFrame:
df <- read.table(text = " columnA columnB
1 A Z
2 B Y
3 C X
4 D W
5 E V
6 F U " )
作为一个简化的例子,我希望做类似的事情:
df %>%
rowwise() %>%
mutate(newColumn = myFunc(.))
输出如下:
columnA columnB newColumn
1 A Z AZ
2 B Y BY
3 C X CX
4 D W DW
5 E V EV
6 F U FU
当我在我的代码中尝试这个时,输出看起来像:
columnA columnB newColumn
1 A Z ABCDEF
2 B Y ABCDEF
3 C X ABCDEF
4 D W ABCDEF
5 E V ABCDEF
6 F U ABCDEF
myFunc应该将一行作为参数但是当我尝试使用rowwise()时,我似乎将整个tibble传递给函数(我可以通过向myFunc添加打印函数来看到这一点)。
如何只传递一行并迭代执行此操作以便将函数应用于每一行?可以用dplyr完成吗?
编辑:
为了我的问题,示例中的myFunc被简化了。实际函数如下所示:
get_chr_vector <- function(row) {
row <- row[,2:ncol(row)] # I need to skip the first row
words <- str_c(row, collapse = ' ')
words <- str_to_upper(words)
words <- unlist(str_split(words, ' '))
words <- words[words != '']
words <- words[!nchar(words) <= 2]
words <- removeWords(words, stopwords_list) # from the tm library
words <- paste(words, sep = ' ', collapse = ' ')
}
答案 0 :(得分:4)
查看?dplyr::do
和?purrr::map
,它们允许您将任意函数应用于任意列,并通过多个一元运算符链接结果。例如,
df1 <- df %>% rowwise %>% do( X = as_data_frame(.) ) %>% ungroup
# # A tibble: 6 x 1
# X
# * <list>
# 1 <tibble [1 x 2]>
# 2 <tibble [1 x 2]>
# ...
请注意,列X
现在包含1x2 data.frame
s(或tibble
s),其中包含原始data.frame
中的行。现在,您可以使用myFunc
将每个版本传递到自定义map
。
myFunc <- function(Y) {paste0( Y$columnA, Y$columnB )}
df1 %>% mutate( Result = map(X, myFunc) )
# # A tibble: 6 x 2
# X Result
# <list> <list>
# 1 <tibble [1 x 2]> <chr [1]>
# 2 <tibble [1 x 2]> <chr [1]>
# ...
Result
列现在包含myFunc
的输出,根据需要应用于原始data.frame
中的每一行。您可以通过连接tidyr::unnest
操作来检索值。
df1 %>% mutate( Result = map(X, myFunc) ) %>% unnest
# # A tibble: 6 x 3
# Result columnA columnB
# <chr> <fctr> <fctr>
# 1 AZ A Z
# 2 BY B Y
# 3 CX C X
# ...
如果需要,unnest
可以限制在特定列,例如unnest(Result)
。
编辑:由于您的原始data.frame
仅包含两列,因此您实际上可以跳过do
步骤并改为使用purrr::map2
。语法与map
非常相似:
myFunc <- function( a, b ) {paste0(a,b)}
df %>% mutate( Result = map2( columnA, columnB, myFunc ) )
请注意,myFunc
现在被定义为二进制函数。
答案 1 :(得分:0)
这应该有效
df <- read.table(text = " columnA columnB
1 A Z
2 B Y
3 C X
4 D W
5 E V
6 F U " )
df %>%
mutate(mutate_Func = paste0(columnA,columnB))
columnA columnB mutate_Func
1 A Z AZ
2 B Y BY
3 C X CX
4 D W DW
5 E V EV
6 F U FU