从重复因子水平清理特征观察
Clean character observation from duplicate factor levels
情况如下:我有一个 "a" 列 class 字符 ,包含许多整数。每个整数代表一个类别。我想知道每一次观察都包含哪些独特的水平。
b 列代表所需的结果:清除重复项,但代表每个唯一级别。
我想知道的是如何清理 a 列,使其看起来像 b 列。我需要实现 60k 行的解决方案。
a b
1 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5 | 4, 5
2 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 | 2
3 86, 86, 86, 86, 86, 37, 37, 37, 37, 37, 37, 8, 8 | 86, 37, 8
a <- c("4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5", "2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2", "86, 86, 86, 86, 86, 37, 37, 37, 37, 37, 37, 8, 8")
b <- c("4, 5", "2", "86, 37, 8")
df <- data.frame(a, b)
我已经阅读了一些关于删除重复因子值的帖子,但是您可以自己尝试一下,这不会产生任何有用的结果。
droplevels(factor(df$a))
基本解决了问题,但是60k行不行
df$a[1] <- factor(unique(as.numeric(unlist(str_extract_all(df$a[1], "[[:digit:]]+")))))
df$a[2] <- factor(unique(as.numeric(unlist(str_extract_all(df$a[2], "[[:digit:]]+")))))
df$a[3] <- factor(unique(as.numeric(unlist(str_extract_all(df$a[3], "[[:digit:]]+")))))
您在这里错过了 sapply
的用法。这使您不必逐个元素地构建,例如:
df$a <- sapply(a,function(i){
paste(unique(strsplit(i,", ")[[1]]),
collapse = ", ")
})
df$a
#> [1] "4, 5" "2" "86, 37, 8"
请记住,strsplit()
适用于字符向量。所以要么在构造数据时使用stringsAsFactors = FALSE
,要么使用as.character()
先将因子变量转换为字符。在我的代码中,我只使用向量 a
.
旁注:我喜欢 stringr
包,但在这种情况下 strsplit()
会给你更快的代码。使用上面的代码,您可以避免因使用正则表达式而产生的大量开销。
情况如下:我有一个 "a" 列 class 字符 ,包含许多整数。每个整数代表一个类别。我想知道每一次观察都包含哪些独特的水平。 b 列代表所需的结果:清除重复项,但代表每个唯一级别。 我想知道的是如何清理 a 列,使其看起来像 b 列。我需要实现 60k 行的解决方案。
a b
1 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5 | 4, 5
2 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 | 2
3 86, 86, 86, 86, 86, 37, 37, 37, 37, 37, 37, 8, 8 | 86, 37, 8
a <- c("4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5", "2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2", "86, 86, 86, 86, 86, 37, 37, 37, 37, 37, 37, 8, 8")
b <- c("4, 5", "2", "86, 37, 8")
df <- data.frame(a, b)
我已经阅读了一些关于删除重复因子值的帖子,但是您可以自己尝试一下,这不会产生任何有用的结果。
droplevels(factor(df$a))
基本解决了问题,但是60k行不行
df$a[1] <- factor(unique(as.numeric(unlist(str_extract_all(df$a[1], "[[:digit:]]+")))))
df$a[2] <- factor(unique(as.numeric(unlist(str_extract_all(df$a[2], "[[:digit:]]+")))))
df$a[3] <- factor(unique(as.numeric(unlist(str_extract_all(df$a[3], "[[:digit:]]+")))))
您在这里错过了 sapply
的用法。这使您不必逐个元素地构建,例如:
df$a <- sapply(a,function(i){
paste(unique(strsplit(i,", ")[[1]]),
collapse = ", ")
})
df$a
#> [1] "4, 5" "2" "86, 37, 8"
请记住,strsplit()
适用于字符向量。所以要么在构造数据时使用stringsAsFactors = FALSE
,要么使用as.character()
先将因子变量转换为字符。在我的代码中,我只使用向量 a
.
旁注:我喜欢 stringr
包,但在这种情况下 strsplit()
会给你更快的代码。使用上面的代码,您可以避免因使用正则表达式而产生的大量开销。