如何通过忽略R中的NA来提取唯一行

时间:2019-01-22 09:02:45

标签: r dataframe

我有一个包含多行和多列的数据集,我想通过在少数情况下忽略一列中的NA并在少数情况下包括NA来提取唯一行。请在下面详细查看

dataset_A

<script type="text/javascript">
    var myMap = new ol.Map({
        target: 'map',
        layers: [
            new ol.layer.Tile({
                source: new ol.source.OSM()
            })
        ],
        view: new ol.View({
            center: ol.proj.fromLonLat([118.0149, -2.5489]),
            zoom: 5
        })
    });

    var features = [];

    myMap.on('click', function(evt) {
        var coordinates = evt.coordinate;
        var lonlat = ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326');
        var lon = lonlat[0];
        var lat = lonlat[1];

        var Markers = {lat: lat, lng: lon};
        addPin(Markers);
    });

    function addPin(Markers) {
        var item = Markers;
        var longitude = item.lng;
        var latitude = item.lat;

        var iconFeature = new ol.Feature({
            geometry: new ol.geom.Point(ol.proj.transform([longitude, latitude], 'EPSG:4326', 'EPSG:3857'))
        });

        var iconStyle = new ol.style.Style({
            image: new ol.style.Icon(({
                anchor: [0.5, 1],
                src: "http://cdn.mapmarker.io/api/v1/pin?text=P&size=50&hoffset=1"
            }))
        });

        iconFeature.setStyle(iconStyle);
        features.push(iconFeature);

        var vectorSource = new ol.source.Vector({
            features: features
        });

        var vectorLayer = new ol.layer.Vector({
            source: vectorSource
        });

        myMap.addLayer(vectorLayer);
    }

预期输出

e_id      age    fn    ln     custom_id
e1234     23     sur   bab    1344789
e1234     23     sur   bab    1344789
e1234     23     sur   bab    1617
e1234     23     sur   bab    NA
e2345     22     nav   kum    NA
e2345     22     nav   kum    52109
e2345     22     nav   kum    NA
e3456     21     ash   kuma   NA
e3456     21     ash   kuma   NA
e4567     23     anu   kot    NA

基本上,如果该e_id中存在custom_id,则我想忽略来自custom_id中具有NA的行,而如果用户在custom_id列中仅具有NA值,我想保留1行并忽略其他行。

尝试:

e_id      age    fn    ln     custom_id
e1234     23     sur   bab    1344789
e1234     23     sur   bab    1617
e2345     22     nav   kum    52109
e3456     21     ash   kuma   NA
e4567     23     anu   kot    NA

使用上面的代码,我无法从数据集中提取一些行,例如1617 custom_id for e_1234 e_id。如果我们能够找到相同的解决方案,那将真的很有帮助。

2 个答案:

答案 0 :(得分:3)

如果slice的{​​{1}}值为dplyr,我们可以使用e_id中的all分组,按custom_id分组,并且仅返回第一行所有非NA行,然后应用NA以获得唯一行。

distinct

也许我使基本的R方法过于复杂,但是使用library(dplyr) df %>% group_by(e_id) %>% slice(if(all(is.na(custom_id))) 1 else which(!is.na(custom_id))) %>% distinct() # e_id age fn ln custom_id # <fct> <int> <fct> <fct> <int> #1 e1234 23 sur bab 1344789 #2 e1234 23 sur bab 1617 #3 e2345 22 nav kum 52109 #4 e3456 21 ash kuma NA #5 e4567 23 anu kot NA 的方法会

ave

答案 1 :(得分:0)

如果理解正确,则可以按以下方式使用dplyr:

library(dplyr)
data %>% filter (., is.na(custom_id)==FALSE) %>% distinct(.)

如果要保留NAN,可以在slice命令中添加其他内容

Book2 %>%  group_by(., e_id) %>%
  slice(., ifelse(all(is.na(custom_id)), 1 , which(!is.na(custom_id))))

编辑:有人比我快,所以请转到上一个答案