R 将缺少的列值替换为';匹配';柱
这是我的后续问题 这已经得到了充分的解决。我的问题是关于多个匹配列 示例数据集:R 将缺少的列值替换为';匹配';柱,r,missing-data,R,Missing Data,这是我的后续问题 这已经得到了充分的解决。我的问题是关于多个匹配列 示例数据集: s <- data.frame(ID=c(191, 282, 202, 210), Group.1=c(NA, "A", NA, "B"), Back.1=c("DD", "AA", "DD", "BB"), Group.2=c("D","A", NA, "B"), Back.2=c("DD", "BB",
s <- data.frame(ID=c(191, 282, 202, 210),
Group.1=c(NA, "A", NA, "B"),
Back.1=c("DD", "AA", "DD", "BB"),
Group.2=c("D","A", NA, "B"),
Back.2=c("DD", "BB", "CC", "AA"),
stringsAsFactors=FALSE)
ID Group.1 Back.1 Group.2 Back.2
1 191 <NA> DD D DD
2 282 A AA A BB
3 202 <NA> DD <NA> CC
4 210 B BB B AA
所以,如果我有许多匹配的列,我希望能够在它们之间映射、循环或应用任何内容。尝试循环函数会产生:
for (i in 1:2){
s[paste0("Group.", i)] <- ifelse(test = !is.na(s[paste0("Group.", i)]),
yes = s[paste0("Group.", i)],
no = s[paste0("Back.", i)])
}
Warning messages:
1: In `[<-.data.frame`(`*tmp*`, paste0("Group.", i), value = list(c("DD", :
provided 4 variables to replace 1 variables
2: In `[<-.data.frame`(`*tmp*`, paste0("Group.", i), value = list(c("D", :
provided 4 variables to replace 1 variables
> s
ID Group.1 Back.1 Group.2 Back.2
1 191 DD DD D DD
2 282 AA AA A BB
3 202 DD DD <NA> CC
4 210 BB BB B AA
for(1:2中的i){
s[paste0(“Group.”,i)]我们可以使用
gr1 <- grep("Group", names(s), value = TRUE)
bc1 <- grep("Back", names(s), value = TRUE)
setDT(s)
for(j in seq_along(gr1)){
s[is.na(get(gr1[j])), (gr1[j]) := get(bc1[j])]
}
s
# ID Group.1 Back.1 Group.2 Back.2
#1: 191 DD DD D DD
#2: 282 A AA A BB
#3: 202 DD DD CC CC
#4: 210 B BB B AA
gr1为什么你有两列的名称是Back.1如果你用长格式做这件事会变得非常简单long预期的'Donk.1'是什么?抱歉@waterling拾起了Back.1。1添加了两次。应该只添加一次。以后会编辑吗?在上一个示例中,不清楚应该从哪个列替换哪个列?你有Back.1、Back.2和B确认1.1存在第1组、第2组和第1组时,用gr1@waterling抱歉,我不明白为什么需要它。我是根据逻辑setDT(s)[is.na(Group.1),Group.1:=Back.1]尝试的
在OP的codeOP中提供,OP希望能够用Back.1
替换Donk.1
,或者用Back.Number
替换一些arbitrarytext.Number
。这句话的意思是:“推广到其他命名列,以便与Back.x进行数字匹配的列也可以有Back.x插补的缺失值。”@谢谢,我错过了那部分。我更新了帖子,假设专栏是交替的
for (i in 1:2){
s[paste0("Group.", i)] <- ifelse(test = !is.na(s[paste0("Group.", i)]),
yes = s[paste0("Group.", i)],
no = s[paste0("Back.", i)])
}
Warning messages:
1: In `[<-.data.frame`(`*tmp*`, paste0("Group.", i), value = list(c("DD", :
provided 4 variables to replace 1 variables
2: In `[<-.data.frame`(`*tmp*`, paste0("Group.", i), value = list(c("D", :
provided 4 variables to replace 1 variables
> s
ID Group.1 Back.1 Group.2 Back.2
1 191 DD DD D DD
2 282 AA AA A BB
3 202 DD DD <NA> CC
4 210 BB BB B AA
s <- data.frame(ID=c(191, 282, 202, 210),
Group.1=c(NA, "A", NA, "B"),
Back.1=c("DD", "AA", "DD", "BB"),
Group.2=c("D","A", NA, "B"),
Back.2=c("DD", "BB", "CC", "AA"),
Donk.1 =c("PP", "ZZ", NA, "QQ"),
stringsAsFactors=FALSE)
gr1 <- grep("Group", names(s), value = TRUE)
bc1 <- grep("Back", names(s), value = TRUE)
setDT(s)
for(j in seq_along(gr1)){
s[is.na(get(gr1[j])), (gr1[j]) := get(bc1[j])]
}
s
# ID Group.1 Back.1 Group.2 Back.2
#1: 191 DD DD D DD
#2: 282 A AA A BB
#3: 202 DD DD CC CC
#4: 210 B BB B AA
gr1 <- names(s)[seq(2, ncol(s), by = 2)]
bc1 <- names(s)[seq(3, ncol(s), by = 2)]
setDT(s)
for(j in seq_along(gr1)){
s[is.na(get(gr1[j])), (gr1[j]) := get(bc1[j])][]
}
s
# ID Group.1 Back.1 Group.2 Back.2 Donk.1 Back.1.1
#1: 191 DD DD D DD PP DD
#2: 282 A AA A BB ZZ AA
#3: 202 DD DD CC CC DD DD
#4: 210 B BB B AA QQ BB
s <- data.frame(ID=c(191, 282, 202, 210),
Group.1=c(NA, "A", NA, "B"),
Back.1=c("DD", "AA", "DD", "BB"),
Group.2=c("D","A", NA, "B"),
Back.2=c("DD", "BB", "CC", "AA"),
Donk.1 =c("PP", "ZZ", NA, "QQ"),
Back.1=c("DD", "AA", "DD", "BB"),
stringsAsFactors=FALSE)