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

在data.frame中按组删除尾随NA

华景焕
2023-03-14

我有一个数据。带有分组变量的帧以及值列中的一些NAs。

df = data.frame(group=c(1,1,2,2,2,2,2,3,3), value1=1:9, value2=c(NA,4,9,6,2,NA,NA,1,NA))

我可以使用zoo::na.trim删除列末尾的NA:这将删除data.frame的最后一行:

library(zoo)
library(dplyr)
df %>% na.trim(sides="right")

现在我想按组删除尾随的 NA;如何使用 DPLYR 实现此目的?

value2列的预期输出:c(NA,4,9,6,2,1)

共有2个答案

楚志强
2023-03-14

使用l应用程序,循环遍历组:

do.call("rbind", lapply(split(df, df$group), na.trim, sides = "right"))

#     group value1 value2
# 1.1     1      1     NA
# 1.2     1      2      4
# 2.3     2      3      9
# 2.4     2      4      6
# 2.5     2      5      2
# 3       3      8      1

或者使用 by,如 @Henrik 所述:

do.call("rbind", by(df, df$group, na.trim, sides = "right"))
齐涛
2023-03-14

您可以编写一个小的辅助函数来检查向量的尾随 NA,然后使用 group_by过滤器

f <- function(x) { rev(cumsum(!is.na(rev(x)))) != 0 }

library(dplyr)
df %>% 
  group_by(group) %>% 
  filter(f(value2))
# A tibble: 6 x 3
# Groups:   group [3]
  group value1 value2
  <dbl>  <int>  <dbl>
1     1      1     NA
2     1      2      4
3     2      3      9
4     2      4      6
5     2      5      2
6     3      8      1

编辑

如果我们需要删除前导零和尾随零,我们需要对该函数进行一点扩展。

f1 <- function(x) { cumsum(!is.na(x)) != 0 & rev(cumsum(!is.na(rev(x)))) != 0 }

给定df1

df1 = data.frame(group=c(1,1,2,2,2,2,2,3,3), value1=1:9, value2=c(NA,4,9,NA,2,NA,NA,1,NA))
df1
#  group value1 value2
#1     1      1     NA
#2     1      2      4
#3     2      3      9
#4     2      4     NA
#5     2      5      2
#6     2      6     NA
#7     2      7     NA
#8     3      8      1
#9     3      9     NA

我们得到这样的结果

df1 %>% 
  group_by(group) %>% 
  filter(f1(value2))
# A tibble: 5 x 3
# Groups:   group [3]
  group value1 value2
  <dbl>  <int>  <dbl>
1     1      2      4
2     2      3      9
3     2      4     NA
4     2      5      2
5     3      8      1
 类似资料:
  • 问题内容: 我需要找到一种方法来在python中转换以下字符串: 等等。我尝试了.rstrip(‘0’)。rstrip(’。’),但是如果输入为0或00则不起作用。 有任何想法吗?谢谢! 问题答案: 更新了 通用以保持精度并处理看不见的值: 输出:

  • 问题内容: 我有字符串(来自DB),其中可能包含数字值。如果它包含数值,我想删除尾随零,例如: ,仅适用于第一个,而不适用于第二个。 很多答案都指向使用,但是我得到的可能不是数字。因此,我认为更好的解决方案可能是通过Regex。 问题答案: 有可能: 我懒又傻,只是 使用相同的解决方案,而不是某些注释中提到的,以便于理解

  • 问题内容: 我正在尝试使用round函数,并且不显示任何尾随零,但最后仍显示一些零。我想得到10.4,但得到这样的东西: 这是我的SQL: 如何在此处删除尾随零?我只需要显示10.4。 问题答案: 您只需要将其强制转换为十进制(12,2)。

  • 问题内容: 我想删除所有结尾的零而不截断或舍入该数字(如果没有的话)。例如,数字可能类似于,在这种情况下,尾随零应被删除。但是这个数字也可能 几乎是 不合理的,比如在屏幕的边缘。有没有办法设置DecimalFormat或其他类以减少尾随的零,同时保持不合理性不变? 问题答案: 如果您愿意切换到,则可以使用#stripTrailingZeroes()方法来完成此操作。

  • 问题内容: 我有一个很长的小数列表,我必须根据某些条件将其调整为10、100、1000,.... 1000000。当我将它们相乘时,有时会想要删除一个无用的尾随零(尽管并非总是如此)。例如… 是否有一个函数告诉小数对象舍弃这些无关紧要的零?我能想到的唯一方法是将其转换为字符串并使用正则表达式替换它们。 应该提到我正在使用python 2.6.5 EDIT senderle的好答案使我意识到,我偶尔

  • 本文向大家介绍Perl删除尾随的换行符,包括了Perl删除尾随的换行符的使用技巧和注意事项,需要的朋友参考一下 示例 该函数chomp将从传递给它的每个标量中删除一个换行符(如果存在)。chomp将使原始字符串变异,并返回删除的字符数 您也可以chomp一次输入多个字符串: 但是通常,没有人担心删除了多少换行符,因此chomp通常在空上下文中看到,并且通常是由于从文件中读取了行: