汇总数据帧以沿子集返回非NA值

时间:2018-03-29 21:02:16

标签: r dplyr lapply

希望有人可以帮助我一招。我在网上找到了类似的问题,但我见过的所有例子都没有完全符合我的要求,也没有在我的数据结构上工作。

我需要沿数据子集从数据框中删除NA,并将剩余的NA值压缩为每个数据子集的行。

示例:

readData

经验法则: 1)需要从每列中删除NA值 2)沿数据子集循环(上例中的“a”列) 3)每个子集的所有列最多具有1个非NA值,但某些列可能具有所有NA值

想法:

  • lapply或dplyr可能有助于循环所有列
  • 如果包含所有条目的子集列,则
  • na.omit可能会有所帮助 行可以被忽略(类似于as.data.frame(lapply(dat.admin,na.omit)))。如果某些子集未返回任何非NA值
  • ,则将lapply输出返回到数据帧时出现问题
  • x [which.min(is.na(x))]如果费力地应用于每一列,就能有效地实现这一目标

任何帮助都赞赏将最终作品放在一起!谢谢!

3 个答案:

答案 0 :(得分:1)

使用dplyr::summarise_all可以实现一个解决方案。 group_by上的数据必须为a

library(dplyr)

dat %>%
  group_by(a) %>%
  summarise_all(funs(.[which.min(is.na(.))]))
# # A tibble: 2 x 4
#    a      b      c      d     
#   <fctr> <fctr> <fctr> <fctr>
# 1   1      B      A      1     
# 2   2      C      A      <NA>  

答案 1 :(得分:1)

不确定这是否是您正在寻找的,但这可能对您有用。它至少会复制您正在寻找的小样本输出:

library(dplyr)
library(tidyr)

dat %>% 
  filter_at(vars(b:c), any_vars(!is.na(.))) %>% 
  group_by(a) %>% 
  fill(b) %>% 
  fill(c) %>% 
  filter_at(vars(b:c), all_vars(!is.na(.)))

# A tibble: 2 x 4
# Groups:   a [2]
       a      b      c      d
  <fctr> <fctr> <fctr> <fctr>
1      1      B      A      1
2      2      C      A     NA

您也可以只使用dplyr

dat %>%
  group_by(a) %>%
  summarise_each(funs(first(.[!is.na(.)])))  

答案 2 :(得分:1)

na.omitlibrary(data.table) merge(setDT(dat)[,a[1],keyby=a], setDT(dat)[,na.omit(.SD),keyby=a],all.x=TRUE)

的解决方案
from bs4 import BeautifulSoup
import urllib2
import shutil
import requests
from urlparse import urljoin
import time


def make_soup(url):
    req = urllib2.Request(url, headers={'User-Agent': "Magic Browser"})
    html = urllib2.urlopen(req)
    return BeautifulSoup(html, 'html.parser')


def get_images(url):
    soup = make_soup(url)
    images = [img for img in soup.findAll('img')]
    print (str(len(images)) + " images found.")
    print 'Downloading images to current working directory.'
    image_links = [each.get('src') for each in images]
    for each in image_links:
        try:
            filename = each.strip().split('/')[-1].strip()
            src = urljoin(url, each)
            print 'Getting: ' + filename
            response = requests.get(src, stream=True)
            # delay to avoid corrupted previews
            time.sleep(1)
            with open(filename, 'wb') as out_file:
                shutil.copyfileobj(response.raw, out_file)
        except:
            print '  An error occurred. Continuing.'
    print 'Done.'


def main():
    url = HIDDEN ADDRESS
    get_images(url)

if __name__ == '__main__':
    main()

我认为合并声明可以改进