在 R 中用条件改变行

问题描述

我有一个数据框,我需要改变一行。

这是数据框

structure(list(groups = structure(c(1L,1L,2L,4L,3L,2L),.Label = c("A","B","C","F"),class = "factor"),type = structure(c(1L,.Label = c("Apple","Bread","curry","Fish"
    ),trip = c(NA,NA,1,2,3,4,NA)),class = "data.frame",row.names = c(NA,-28L))

如果存在组 A 中的值,我必须用“检测到”标记标记“行程”列。

A 组被标记为更正,因为在 A 组中我出现了一次旅行 (1)。

groups  type  trip   trip_corrected
1   A   Apple   NA corrected
2   A   Apple   NA corrected
3   A   Apple   NA corrected
4   A   Apple   1  corrected
5   A   Apple   1  corrected
6   B   Bread   NA corrected
7   B   Bread   NA corrected
8   B   Bread   NA corrected
9   B   Bread   NA corrected
10  B   Bread   2  corrected
11  B   Bread   NA corrected
12  A   Apple   NA
13  A   Apple   NA
14  F   Fish    NA corrected
15  F   Fish    3  corrected
16  F   Fish    3  corrected
17  F   Fish    NA corrected
18  A   Apple   NA
19  A   Apple   NA
20  C   curry   NA corrected
21  C   curry   NA corrected
22  C   curry   4  corrected
23  C   curry   NA corrected
24  B   Bread   NA
25  B   Bread   NA
26  B   Bread   NA
27  B   Bread   NA
28  B   Bread   NA

感谢您的帮助

解决方法

您可以使用 rleid 创建组并为至少具有一个非 NA 值的组分配 'corrected'

library(data.table)

setDT(df)[,trip_corrected := if(any(!is.na(trip))) 'corrected' else '',rleid(groups,type)]
df

#    groups  type trip trip_corrected
# 1:      A Apple   NA      corrected
# 2:      A Apple   NA      corrected
# 3:      A Apple   NA      corrected
# 4:      A Apple    1      corrected
# 5:      A Apple    1      corrected
# 6:      B Bread   NA      corrected
# 7:      B Bread   NA      corrected
# 8:      B Bread   NA      corrected
# 9:      B Bread   NA      corrected
#10:      B Bread    2      corrected
#11:      B Bread   NA      corrected
#12:      A Apple   NA               
#13:      A Apple   NA               
#14:      F  Fish   NA      corrected
#15:      F  Fish    3      corrected
#16:      F  Fish    3      corrected
#17:      F  Fish   NA      corrected
#18:      A Apple   NA               
#19:      A Apple   NA               
#20:      C curry   NA      corrected
#21:      C curry   NA      corrected
#22:      C curry    4      corrected
#23:      C curry   NA      corrected
#24:      B Bread   NA               
#25:      B Bread   NA               
#26:      B Bread   NA               
#27:      B Bread   NA               
#28:      B Bread   NA               
#    groups  type trip trip_corrected

您也可以在 dplyr 中使用它:

library(dplyr)

df %>%
  group_by(grp = rleid(groups,type)) %>%
  mutate(trip_corrected = if(any(!is.na(trip))) 'corrected' else '') %>%
  ungroup
,

我们可以使用base R

df$trip_corrected <- with(df,ave(trip,with(rle(paste(groups,type)),rep(seq_along(values),lengths)),FUN = function(x) if(any(!is.na(x))) 'corrected' else ''))

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...