r - 使值彼此不相邻 NA
问题描述
下面数据框中的值 >=10(值 31、89、12、69)有时确实按 89 和 12 的顺序排列。我的意思是按 123456789 的顺序排列,它们彼此相邻。我想让彼此不相邻的值(31,69,在 31 nr 2 之间缺少顺序,对于 69,nr 7 和 8 缺少顺序)不适用。如何编码?想象一个大数据集!:)
id <- factor(rep(letters[1:2], each=5))
A <- c(1,2,NA,67,8,9,0,6,7,9)
B <- c(5,6,31,9,8,1,NA,9,7,4)
C <- c(2,3,5,NA,NA,2,7,6,4,6)
D <- c(6,5,89,3,2,9,NA,12,69,8)
df <- data.frame(id, A, B,C,D)
df
id A B C D
1 a 1 5 2 6
2 a 2 6 3 5
3 a NA 31 5 89
4 a 67 9 NA 3
5 a 8 8 NA 2
6 b 9 1 2 9
7 b 0 NA 7 NA
8 b 6 9 6 12
9 b 7 7 4 69
10 b 9 4 6 8
它应该看起来像:
id A B C D
1 a 1 5 2 6
2 a 2 6 3 5
3 a NA NA 5 89
4 a 67 9 NA 3
5 a 8 8 NA 2
6 b 9 1 2 9
7 b 0 NA 7 NA
8 b 6 9 6 12
9 b 7 7 4 NA
10 b 9 4 6 8
解决方案
这是一个测试单个数字的函数
MyFunction <- function(A){
NumbersToCheck <- lapply(strsplit(as.character(A),""),as.integer)
check <- lapply(2:length(unlist(NumbersToCheck)), function(X) ifelse(NumbersToCheck[[1]][X]-NumbersToCheck[[1]][X-1]==1,TRUE,FALSE))
return(ifelse(FALSE %in% check,NA,A))
}
然后可以将其应用于您的整个 df 如下
df[,2:ncol(df)] <- lapply(2:ncol(df), function(X) unlist(lapply(df[,X],MyFunction)))
得到以下结果
> df
id A B C D
1 a 1 5 2 6
2 a 2 6 3 5
3 a NA NA 5 89
4 a 67 9 NA 3
5 a 8 8 NA 2
6 b 9 1 2 9
7 b 0 NA 7 NA
8 b 6 9 6 12
9 b 7 7 4 NA
10 b 9 4 6 8
推荐阅读
- scatter-plot - 如何在散点图中添加自定义六进制颜色作为 cmap?
- flutter - 使用 Dio 的 Firebase 性能:如何填充 responsePayloadSize、requestPayloadSize
- java - 如果方法依赖于实例创建,我们不应该声明静态方法吗?
- google-chrome-extension - 试图在选项卡上执行 JS 代码但未定义执行脚本
- c++ - 数组和隐式生命周期对象创建
- python - 即使仅使用浮点数,也会弹出 f 字符串中的“ValueError:整数格式说明符中不允许的精度”
- java - org.apache.catalina.LifecycleException: java.lang.IllegalArgumentException: java.lang.ClassNotFoundException: com.isomorphic.base.InitListener
- gmail - 使用 gmail API 向“自己”发送电子邮件时,您如何确定消息何时/是否到达?
- stimulusjs - 在页面的其他地方重复使用刺激动作?
- sql - 如何获取带有特定事件的 SQL AdmitDate 和 DischargeDate?