dplyr:如何(简明地)对不同的情况使用mutate条件?

时间:2016-11-03 14:24:31

标签: r dplyr

考虑以下示例

data <- data_frame(name = c('A','B','C','C',NA,'D'))

> data
# A tibble: 6 × 1
   name
  <chr>
1     A
2     B
3     C
4     C
5  <NA>
6     D

在此,我知道变量name实际上映射到'A' -> 'one''B' -> 'two'。我只想创建一个获取映射值的变量。当然,在我的原始数据集中,我还有更多要映射的案例。

的工作如下。

data <- data %>%
  mutate(mapping = ifelse(name == 'A', 'one', name),
         mapping = ifelse(name == 'B', 'two', name))
> data
# A tibble: 6 × 2
   name mapping
  <chr>   <chr>
1     A       A
2     B     two
3     C       C
4     C       C
5  <NA>    <NA>
6     D       D

这里有什么问题?在dplyr中最有效的方法是什么?

非常感谢!

3 个答案:

答案 0 :(得分:9)

如果你想避免嵌套 //for header <head> <script type="text/javascript" src="{{ URL::asset('src/js/jquery-1.10.2.js') }}"></script> <script type="text/javascript" src="{{ URL::asset('src/js/jquery-ui.js') }}"></script> <link rel="stylesheet" href="{{ URL::to('src/css/jquery-ui.css') }}"> </head> //body <div class="col-sm-6 feature" > <div class="ui-widget"> <label for="skills">Skills: </label> <input type="text" class="search_keyword" id="skills" placeholder="Search.." name="skills" /> </div> <script> $(function() { $( "#skills" ).autocomplete({ source: "{{URL::route('auto')}}" //source: ["a","b"] }); }); </script> </div><!-- end feature --> //route Route::get('/', function () { return view('welcome'); }); Route::get('/auto', [ 'uses' => 'SearchController@AutoSug', 'as' => 'auto' ]); //controller class SearchController extends Controller { public function AutoSug() { $auto_s = DB::table('skills') ->pluck('skill'); return response()->json($auto_s); } } ,你应该简单地创建一个映射数据框和内连接。

ifelse

答案 1 :(得分:1)

对于两个值,您可以尝试类似:

data <- data %>%
    mutate(mapping = ifelse(name == 'A', 'one',
    ifelse(name == 'B', 'two', 'other')))

然而,您最好创建一个包含地图的单独数据框,然后使用dplyr :: left_join()将其添加到主df中。

答案 2 :(得分:1)

data %>% mutate(mapping = recode(name, A="one", B="two"))

当没有太多替换时,重新编码可能很方便。