楼主: Anthony_x2017
1280 9

[问答] 请教关于数据筛选过滤问题 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

初中生

33%

还不是VIP/贵宾

-

威望
0
论坛币
13 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
82 点
帖子
6
精华
0
在线时间
19 小时
注册时间
2019-8-23
最后登录
2022-11-5

楼主
Anthony_x2017 发表于 2021-3-21 23:35:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我有一个dataframe,第一列为唯一字符,第二列为名称(名称有两个特点,一是有多个重复值,二是在某一行第一次出现后,如果下一行还是这个名词,则后面相同名称的第二列为空值,即该行名词与上行相同),第三列为对应的数值。结构如下:
   A        B       C
   1       ab      23
   2       ac      43
   3                46
   4       ab     54
   5                53
   6                49
   7       be     78
   8       ac     83
   9               98
   ...

现在我想在这个dataframe中用一组名称向量x筛选,如ac, ab, be...,希望一个新的dataframe,其内容中需要保留每个名称的所有数值,包括第二列中的空值,如筛选后ac,能保留上表中的4个值43,46,83,98。

如何能在R中实现,请教大神指教!谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据筛选 Dataframe Frame Fram Data 求助 数据筛选 数据过滤

沙发
xc2156 发表于 2021-3-22 11:03:57
可以通过zoo包中的na.locf()函数来填充第二列中的空值,先通过dplyr中的mutate来添加一个新的列,它是不含有空值的,空值都被填充了,再通过filter来筛选你要的数据
  1. df %>%
  2.     mutate(D = zoo::na.locf(B)) %>%
  3.     filter(D == 'ac')
复制代码





藤椅
屋檐滴语 发表于 2021-3-22 12:40:03
  1. library(dplyr)
  2. library(tidyr)

  3. x = c("ac", "ab")
  4. df %>%
  5.   fill(B) %>%
  6.   filter(B %in% x) -> new_df
  7. print(new_df)
复制代码

板凳
Anthony_x2017 发表于 2021-3-22 15:21:40
xc2156 发表于 2021-3-22 11:03
可以通过zoo包中的na.locf()函数来填充第二列中的空值,先通过dplyr中的mutate来添加一个新的列,它是不含有 ...
谢谢回复!!

试了您说的方法,df %>% mutate(D = zoo::na.locf(B))后,结果是是D列和B列完全一样,B列中的空值在D列中也还是空值,没有填充,是我哪里有误吗。

另外最后过滤的时候是一个向量factor包含多个名称,不仅是一个,可以直接用filter(D == factor)吗?

谢谢!

报纸
Anthony_x2017 发表于 2021-3-22 15:42:25
屋檐滴语 发表于 2021-3-22 12:40
谢谢!

测试了下,您这个方法实现了筛选,不过检查的时候发现,之前B列中有名称的行在new_df都保留了,但空值的行在new_df中都没有了。所以好像没有完成填充。。

谢谢

地板
Anthony_x2017 发表于 2021-3-22 15:44:03
xc2156 发表于 2021-3-22 11:03
可以通过zoo包中的na.locf()函数来填充第二列中的空值,先通过dplyr中的mutate来添加一个新的列,它是不含有 ...
谢谢,这个方法试了之后,新的D列和原来的B列完全一样,没有名称的空值行,还是没有填充,是不是哪里还是有问题

谢谢

7
屋檐滴语 发表于 2021-3-22 22:23:51
Anthony_x2017 发表于 2021-3-22 15:42
谢谢!

测试了下,您这个方法实现了筛选,不过检查的时候发现,之前B列中有名称的行在new_df都保留了, ...
原数据你提供了,所以理解上没有差异,可是预期要达到的结果你最好也贴出来,不然就只能猜了。

8
xc2156 发表于 2021-4-12 17:48:42
屋檐滴语 发表于 2021-3-22 12:40
谢谢,以前不知道fill这个函数,dplyr里没有找到过,原来是在tidyr里,这样就不需要用zoo里的na.locf了,可以一个tidyverse走到底了

9
xc2156 发表于 2021-4-12 18:01:41
Anthony_x2017 发表于 2021-3-22 15:44
谢谢,这个方法试了之后,新的D列和原来的B列完全一样,没有名称的空值行,还是没有填充,是不是哪里还是 ...
我大概知道你的问题了

你的原数据框里的空值可能是"", 而不是NA,你需要先把他们转成NA,NA是R中的特殊数据类型,不是字符串"NA". 转换之后无论用我介绍的zoo::na.locf(),还是用屋檐滴语介绍的tidyr::fill()都是可以达到你要的效果
  1. df %>%
  2.     mutate(D = if_else(B == '', NA_character_, B),
  3.            D = zoo::na.locf(B)) %>%
  4.     filter(D == 'ac')
复制代码

10
乐天天12300 发表于 2021-4-12 19:58:49
  1. myfun <- function(x) {
  2.   stopifnot(is.vector(x))
  3.   for (i in seq_along(x)) {
  4.     if (i > 1 && any(c(is.na(x[i]),nchar(x[i]) == 0))) x[i] <- x[i - 1]
  5.   }
  6.   x
  7. }

  8. > myfun(c("", "dd", "", "", "dddd", NA))
  9. [1] ""     "dd"   "dd"   "dd"   "dddd" "dddd"
复制代码

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-22 03:53