基于拆分另一个来改变两个新列

时间:2017-05-15 02:01:56

标签: r dplyr

我的tibble中有一个名为sourceMedium的列,其字符串如此:

"apples / pears"

我想将其变为两个新列,然后删除原始列。我试图在dplyr操作链中做到这一点,我无法得到它:

wrangled <- gaDataSessionsAggregate %>%
+ mutate(source = unlist(strsplit(sourceMedium, "/"))[1],
         medium = unlist(strsplit(sourceMedium, "/"))[2])

这会运行,但我只在两个新字段中获得一个唯一值。每个新字段中应该有许多基于原始列的唯一值。看起来r保持tibble中的第一个值并将其应用于列中的每个其他实例。

什么是最短的,最常见的&#34; dplyr esque&#34;采取现场sourceMedium的方式,分成两个新的领域&#34; source&#34;和&#34;媒体&#34;基于斜杠分隔符&#34; /&#34;?

1 个答案:

答案 0 :(得分:0)

Dplyr不像处理矢量列一样处理列表列的元素。因此,在变异/取消列表之前传递dplyr::rowwise()

library(dplyr)
library(stringr)

orig <- tibble(sourceMedium = c('apples / pears', 'red / blue', 'green / grey',
                                'wet / dry', 'ear / nose', 'mac / linux'))

wrangled <- orig %>%
    dplyr::mutate(tempcol = stringr::str_split(sourceMedium, ' / ')) %>%
    dplyr::rowwise() %>%
    dplyr::mutate(source = unlist(tempcol)[1], medium = unlist(tempcol)[2]) %>%
    dplyr::select(-tempcol)
wrangled

提供以下输出:

Source: local data frame [6 x 3]
Groups: <by row>

# A tibble: 6 × 3
    sourceMedium source medium
           <chr>  <chr>  <chr>
1 apples / pears apples  pears
2     red / blue    red   blue
3   green / grey  green   grey
4      wet / dry    wet    dry
5     ear / nose    ear   nose
6    mac / linux    mac  linux
>