当前位置: 首页 > 知识库问答 >
问题:

如何在删除NA值的同时将多条记录折叠为一条

燕禄
2023-03-14

假设我有以下数据framedf

name <- c("Bill", "Rob", "Joe", "Joe")
address <- c("123 Main St", "234 Broad St", NA, "456 North Ave")
favteam <- c("Dodgers", "Mets", "Pirates", NA)

df <- data.frame(name = name, 
                 address = address,
                 favteam = favteam)
df
  name       address favteam
1 Bill   123 Main St Dodgers
2  Rob  234 Broad St    Mets
3  Joe          <NA> Pirates
4  Joe 456 North Ave    <NA>

我要做的是按名称(或一般情况下,任意数量的分组变量)折叠(合并)行,并使用na以外的任何其他值替换最终数据中的na值,如下所示:

df_collapse <- foo(df)

  name   address        favteam
1 Bill   123 Main St    Dodgers
2  Rob   234 Broad St      Mets
3  Joe   456 North Ave  Pirates

共有1个答案

宋洲
2023-03-14

下面是DPLYR的一个选项:

library(dplyr)

df %>%
  group_by(name) %>%
  summarise_each(funs(first(.[!is.na(.)]))) # or summarise_each(funs(first(na.omit(.))))

#Source: local data frame [3 x 3]
#
#  name       address favteam
#1 Bill   123 Main St Dodgers
#2  Joe 456 North Ave Pirates
#3  Rob  234 Broad St    Mets

和data.table:

library(data.table)
setDT(df)[, lapply(.SD, function(x) x[!is.na(x)][1L]), by = name]
#   name       address favteam
#1: Bill   123 Main St Dodgers
#2:  Rob  234 Broad St    Mets
#3:  Joe 456 North Ave Pirates

setDT(df)[, lapply(.SD, function(x) head(na.omit(x), 1L)), by = name]

考虑这个修改过的示例数据(看最后一行):

name <- c("Bill", "Rob", "Joe", "Joe", "Joe")
address <- c("123 Main St", "234 Broad St", NA, "456 North Ave", "123 Boulevard")
favteam <- c("Dodgers", "Mets", "Pirates", NA, NA)

df <- data.frame(name = name, 
                 address = address,
                 favteam = favteam)

df
#  name       address favteam
#1 Bill   123 Main St Dodgers
#2  Rob  234 Broad St    Mets
#3  Joe          <NA> Pirates
#4  Joe 456 North Ave    <NA>
#5  Joe 123 Boulevard    <NA>

然后,您可以使用这种data.table方法来获得数量因名称而不同的非NA响应:

setDT(df)[, lapply(.SD, function(x) unique(na.omit(x))), by = name]
#   name       address favteam
#1: Bill   123 Main St Dodgers
#2:  Rob  234 Broad St    Mets
#3:  Joe 456 North Ave Pirates
#4:  Joe 123 Boulevard Pirates
 类似资料:
  • 问题内容: 我有一个这样的 LoginTime 表: 我想删除的最后一条记录。用户的最后一条记录可以通过识别。 如何使用一个查询执行此操作。 问题答案: 您需要按user_id(例如WHERE user_id = 1)过滤表,然后按时间(例如ORDER BY datetime)对其进行排序,然后将查询限制为一项(例如LIMIT1),然后删除此查询的结果。最后,您将获得如下查询:

  • 问题内容: 删除unt_uid为null的活动 这将是最快的方法,但是在该语句完成之前没有人可以访问数据库/表,因此这是不可行的。 我定义了一个游标以在工作时间内完成此任务,但无论如何对生产率的影响很大。那么如何删除这些记录,以保证该数据库的正常使用? 它是32位Win2003上的SQL-2005 Server。第二个问题是:您估计这项工作要完成多长时间(6个小时或60个小时)?(是的,我知道这取

  • 我只是开始尝试做一个新的引导站点,并希望有搜索栏作为一个单独的折叠切换的一部分。基本上在navbar的右边,我想要搜索栏切换,然后菜单切换。 我有以下几个问题: 我怎样才能点亮这两个按钮,使它们在右侧相邻?其中一个似乎坐在中间,我不知道为什么。 由于我将表单分隔成一个不同的DIV,它似乎不再对齐页面的右侧,而是缩进了一些。为什么? 我一次只打开一个折叠菜单。例如。如果搜索是打开的,我点击菜单切换,

  • 问题内容: 我想在7天后从我的MySQL数据库中删除一些消息。 我的消息表行具有以下格式:id | 留言| 日期 日期是标准格式的时间戳。2012-12-29 17:14:53 我当时以为MySQL事件将成为替代cron工作的方式。 我想对有经验的SQL人员来说,这是一个简单的问题,如何在下面的括号中编写删除消息部分的代码? 一个例子,将不胜感激,谢谢。 问题答案: 您可以尝试使用以下条件: 这样

  • 问题内容: 我正在使用Spring JPA存储库将Twitter推文保存在数据库中。鸣叫的日期在MySQL数据库中另存为Datetime。现在,我想删除所有超过一年的推文。我看到有功能,想到了类似的东西。我知道那不是正确的语法,但是我不知道该怎么做。这是我所拥有的: 编辑已解决: 仓库: 服务: 问题答案: 为此,您需要2个步骤。首先,您需要一个方法,该方法将要删除消息的日期作为参数,并且根本不需

  • 问题内容: 我有一个具有以下布局的表: 我想将表转换为如下所示的布局: 我在PostgreSQL中使用SQL。有没有一种简单的方法(且内存效率高)来做到这一点?我看过一些提到使用透视的帖子,但是我不确定这是否行得通,而且我看到的描述似乎是针对Oracle的。 问题答案: 如果尚未安装,请首先安装扩展tablefunc。每个数据库需要做一次。 你需要的PostgreSQL 9.1 的。在旧版本中,您