首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >检查NA行,但在单独的列中使用值指定的起始列。

检查NA行,但在单独的列中使用值指定的起始列。
EN

Stack Overflow用户
提问于 2018-09-04 00:48:44
回答 3查看 42关注 0票数 1

我在R里有张桌子,看起来是这样的:

代码语言:javascript
运行
AI代码解释
复制
ID    Year    Source_1999    Source_2000    Source_2001    Source_2002
 1    1999            ABC            ABC           ABC             ABC
 2    2001            ABC            BBB           XYZ              NA
 3    2000             NA            ABC           BBB             BBB
 4    2001             NA             NA            NA              NA

该表有许多行,还有相当多的"Source_“列--可能大约有50列。

我需要创建一个新列,说明是否有任何源列包含NA,但我只想检查“年份”列中大于或等于年份的年份。所以我的新桌子是这样的:

代码语言:javascript
运行
AI代码解释
复制
ID    Year    Source_1999    Source_2000    Source_2001    Source_2002   NA_check
 1    1999            ABC            ABC           ABC             ABC   No  
 2    2001            ABC            BBB           XYZ              NA  Yes 
 3    2000             NA            ABC           BBB             BBB   No
 4    2001             NA             NA            NA              NA  Yes

(新的"NA“列中的值可以是任何类型的二进制指示符)

我每年都尝试使用if循环和函数is.na(df,start_year:finish_year),但这似乎不起作用,而且效率也不高。

将来,我可能希望以这种方式检查其他列,即计数特定的值,或者对行进行求和,但是使用由今年列指定的起始列,因此我希望我可以调整任何答案来实现这一点。

任何帮助都很感激。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-04 01:01:37

这对gathertidyrspread以及group_bydplyrmutatereadrparse_number来说都是一项不错的任务:

代码语言:javascript
运行
AI代码解释
复制
library(tidyverse)

mydata %>% 
  gather(source, value, starts_with("Source")) %>% 
  mutate(source_year = parse_number(source)) %>% 
  group_by(ID, Year) %>% 
  mutate(any_na = anyNA(value[Year <= source_year])) %>% 
  select(-source_year) %>% 
  spread(source, value)

# A tibble: 4 x 7
# Groups:   ID, Year [4]
#      ID  Year any_na Source_1999 Source_2000 Source_2001 Source_2002
#   <int> <int> <lgl>  <chr>       <chr>       <chr>       <chr>      
# 1     1  1999 FALSE  ABC         ABC         ABC         ABC        
# 2     2  2001 TRUE   ABC         BBB         XYZ         NA         
# 3     3  2000 FALSE  NA          ABC         BBB         BBB        
# 4     4  2001 TRUE   NA          NA          NA          NA  

一步

首先,将数据从宽格式转换为长格式,并提取源列的年份。

代码语言:javascript
运行
AI代码解释
复制
mydata <- mydata %>% 
  gather(source, value, starts_with("Source")) %>% 
  mutate(source_year = parse_number(source)) 

mydata
# A tibble: 16 x 5
#      ID  Year source      value source_year
#   <int> <int> <chr>       <chr>       <dbl>
# 1     1  1999 Source_1999 ABC          1999
# 2     2  2001 Source_1999 ABC          1999
# 3     3  2000 Source_1999 NA           1999
# 4     4  2001 Source_1999 NA           1999
# 5     1  1999 Source_2000 ABC          2000
# ...

然后按ID和年份分组,以便在这些组中应用以下计算。用大于或等于组年的source_Years筛选值,并检查是否存在NA值。

代码语言:javascript
运行
AI代码解释
复制
mydata <- mydata %>% 
  group_by(ID, Year) %>% 
  mutate(any_na = anyNA(value[Year <= source_year])) 

mydata
# A tibble: 16 x 6
# Groups:   ID, Year [4]
# ID  Year source      value source_year any_na
# <int> <int> <chr>       <chr>       <dbl> <lgl> 
# 1     1  1999 Source_1999 ABC          1999 FALSE 
# 2     2  2001 Source_1999 ABC          1999 TRUE  
# 3     3  2000 Source_1999 NA           1999 FALSE 
# 4     4  2001 Source_1999 NA           1999 TRUE  
# 5     1  1999 Source_2000 ABC          2000 FALSE 
# ...

最后,删除不再需要的yource_year列,并将数据从长格式转换为宽格式:

代码语言:javascript
运行
AI代码解释
复制
mydata <- mydata %>% 
  select(-source_year) %>% 
  spread(source, value)

数据

代码语言:javascript
运行
AI代码解释
复制
mydata <- tibble(ID = 1:4, 
                 Year = c(1999L, 2001L, 2000L, 2001L), 
                 Source_1999 = c("ABC", "ABC", NA, NA), 
                 Source_2000 = c("ABC", "BBB", "ABC", NA), 
                 Source_2001 = c("ABC", "XYZ", "BBB", NA), 
                 Source_2002 = c("ABC", NA, "BBB", NA))
票数 2
EN

Stack Overflow用户

发布于 2018-09-04 01:29:55

以下是两种data.table方法:

不一定是最快的:

代码语言:javascript
运行
AI代码解释
复制
dt[, NA_check := Reduce(`|`, lapply(paste0("Source_", 1999:2002), 
    function(x) x >= paste0("Source_", Year) & is.na(get(x))))]

转换成长格式:

代码语言:javascript
运行
AI代码解释
复制
checkNA <- melt(dt, id.vars=c("ID", "Year"), variable.factor=FALSE)[,
    anyNA(value[variable >= paste0("Source_", Year)]),
    by=.(ID, Year)]
dt[checkNA , on=.(ID, Year), NA_check := V1]

数据:

代码语言:javascript
运行
AI代码解释
复制
library(data.table)
dt <- fread("ID    Year    Source_1999    Source_2000    Source_2001    Source_2002
1    1999            ABC            ABC           ABC             ABC
2    2001            ABC            BBB           XYZ              NA
3    2000             NA            ABC           BBB             BBB
4    2001             NA             NA            NA              NA")
票数 1
EN

Stack Overflow用户

发布于 2018-09-04 07:38:56

下面是一个带有base Rapply选项,循环遍历行,获取第一个非NA元素的索引,从该元素中子集行元素,检查anyNA中的NA,并在此基础上创建'No/Yes‘值。

代码语言:javascript
运行
AI代码解释
复制
df1$any_NA <- apply(df1[-(1:2)], 1, function(x) 
  c("No", "Yes")[anyNA(x[pmax(which(!is.na(x))[1], 1,
               na.rm = TRUE):length(x)]) + 1])
df1$any_NA
#[1] "No"  "Yes" "No"  "Yes"

数据

代码语言:javascript
运行
AI代码解释
复制
df1 <- structure(list(ID = 1:4, Year = c(1999L, 2001L, 2000L, 2001L), 
Source_1999 = c("ABC", "ABC", NA, NA), Source_2000 = c("ABC", 
"BBB", "ABC", NA), Source_2001 = c("ABC", "XYZ", "BBB", NA
), Source_2002 = c("ABC", NA, "BBB", NA)), class = "data.frame", row.names = c(NA, 
-4L))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52162344

复制
相关文章
React 钩子:useState()
React 是一个流行的JavaScript库,用于构建用户界面。在 React 16.8 版本中引入了钩子(Hooks)的概念,它为函数组件提供了状态管理和其他功能。本文将着重介绍最常用的钩子之一:useState()。
网络技术联盟站
2023/07/13
4160
React 钩子:useState()
React技巧之将useState作为对象
原文链接:https://bobbyhadz.com/blog/react-type-usestate-object[1]
chuckQu
2022/08/19
9820
美丽的公主和它的27个React 自定义 Hook
在上一篇git 原理中我们在「前置知识点」中随口提到了Hook。其中,就有我们比较熟悉的React Hook。
前端柒八九
2023/10/25
8340
美丽的公主和它的27个React 自定义 Hook
react中的useState源码分析
简单说下为什么React选择函数式组件,主要是class组件比较冗余、生命周期函数写法不友好,骚写法多,functional组件更符合React编程思想等等等。更具体的可以拜读dan大神的blog。其中Function components capture the rendered values这句十分精辟的道出函数式组件的优势。
flyzz177
2022/12/14
5150
换个角度思考 React Hooks
从 Vue 迁移到 React ,不太习惯 React Hooks 的使用?也许换个角度思考 Hooks 出现的意义会对你有所帮助。 1 什么是 Hooks 简而言之, Hooks 是个函数,通过使用 Hooks 可以让函数组件功能更加丰富。 在某些场景下,使用 Hooks 是一个比使用类组件更好的主意。 1.1 Hooks 出现的背景 在 Hooks 出现之前,函数组件对比类组件(class)形式有很多局限,例如: 不能使用 state、ref 等属性,只能通过函数传参的方式使用 props 没有生命周
用户1097444
2022/06/29
4.8K0
换个角度思考 React Hooks
React技巧之具有空对象初始值的useState
原文链接:https://bobbyhadz.com/blog/react-typescript-usestate-empty-object[1]
chuckQu
2022/08/19
1.5K0
react的useState源码分析2
简单说下为什么React选择函数式组件,主要是class组件比较冗余、生命周期函数写法不友好,骚写法多,functional组件更符合React编程思想等等等。更具体的可以拜读dan大神的blog。其中Function components capture the rendered values这句十分精辟的道出函数式组件的优势。
flyzz177
2023/01/04
3550
useState的使用
在 React 的函数式组件当中,是没有状态的,但是使用 React 提供的 Hook 可以让函数式组件拥有状态。
小小杰啊
2022/12/21
6190
React技巧之设置input值
原文链接:https://bobbyhadz.com/blog/react-set-input-value-on-button-click[1]
chuckQu
2022/08/19
2K0
React技巧之设置input值
React 中的 useState() 是什么?
在 React 中,useState() 是一个用于在函数组件中声明状态的 Hook。它是 React 16.8 引入的一种新的状态管理方式。
王小婷
2023/09/15
7640
教你如何在 React 中逃离闭包陷阱 ...
众所周知,JavaScript 中的闭包(Closures)一定是这种语言最可怕的特性之一,即使是无所不知的 ChatGPT 也是这样说的。另外它可能也是最隐蔽的语言特性之一,我们在编写 React 代码时经常会用到它,但是大多数时候我们甚至没有意识到这一点。但是,我们终究还是离不开它:如果我们想编写复杂且性能很好的 React 应用,就必须了解闭包。所以,今天我们一起来学习以下几点:
ConardLi
2023/09/11
7700
教你如何在 React 中逃离闭包陷阱 ...
使用React hooks处理复杂表单状态数据
自从React hooks发布以来已经有一段时间了,我很喜欢这个特性。这个hooks把我勾上了!
前端知否
2020/03/23
3.4K0
使用React hooks处理复杂表单状态数据
超性感的React Hooks(三):useState
这几天和许多同学聊了使用React Hooks的感受。总体感觉是,学会使用并不算难,但能用好却并不简单。
用户6901603
2020/07/23
2.4K0
为什么 React Hooks useState 更新不符预期?
不合预期的更新 在定时器中,用useState使数字0做每1秒递增1,但结果不合预期:数字增加一次后便不再改变? Counter.js // Counter.js import React, { us
前端老王
2020/09/14
1.7K0
30分钟精通React今年最劲爆的新特性——React Hooks
你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? ——拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function。
桃翁
2018/12/14
2K0
React源码中的useState,useReducer
大家都知道hooks是在函数组件的产物。之前class组件为什么没有出现hooks这种东西呢?
goClient1992
2022/12/07
1K0
React useReducer 终极使用教程
useReducer 是在 react V 16.8 推出的钩子函数,从用法层面来说是可以代替useState。相信前期使用过 React 的前端同学,大都会经历从 class 语法向 hooks 用法的转变,react 的 hooks 编程给我们带来了丝滑的函数式编程体验,同时很多前端著名的文章也讲述了 hooks 带来的前端心智的转变,这里就不再着重强调,本文则是聚焦于 useReducer 这个钩子函数的原理和用法,笔者带领大家再一次深入认识 useReducer。
蒋川@卡拉云
2022/08/31
3.8K0
React useReducer 终极使用教程
React Hooks vs React Component
是不是简单多了!可以看到, Example变成了一个函数,但这个函数却有自己的状态(count),同时它还可以更新自己的状态(setCount)。这个函数之所以这么了不得,就是因为它注入了一个hook– useState,就是这个hook让我们的函数变成了一个有状态的函数。
javascript.shop
2019/09/04
3.4K0
React Hooks vs React Component
使用Immer解决React对象深度更新的痛点
最近接到一个需求,修改一个使用React编写的工单系统,具体就是在创建工单的时候能配置一些增强工单通用性的功能然后把配置传给后端进行存储,乍一听其实挺简单,但是由于数据结构没设计好,写的时候非常的麻烦。
Jou
2023/09/06
1.1K0
使用Immer解决React对象深度更新的痛点
宝啊~来聊聊 9 种 React Hook
文章会为你讲述 React 9种 Hook 的日常用法以及进阶操作,从浅入深彻底掌握 React Hook!
19组清风
2022/02/28
1.1K0
宝啊~来聊聊 9 种 React Hook

相似问题

React useState钩子-更新对象的状态

227

使用useState钩子更新函数后,React不会更新状态

120

使用React中的useState钩子更新对象

10

React钩子useState不更新状态

324

如何使用useState钩子更新对象状态

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档