我有一个键值对,如下所示,是字符串
> data$Frequency
1 A1:6,B1:4,AA1:3
2 BB1:2,AAA1:1
3 BBB1:1,A2:1,C2:3
4 D1:1
> class(data$Frequency)
"character"
FreqIndex<-which(colnames(data)=="Frequency")
freq_string<-paste(as.character(unlist(data[FreqIndex])),collapse=",")
print(freq_string)
>"A1:6,B1:4,AA1:3,BB1:2,AAA1:1,BBB1:1,A2:1,C2:3,D1:1"
如何找到值大于2的键
A1,B1,AA1,C2
答案 0 :(得分:2)
以下是strsplit
的另一种变体,我们将:
或,
拆分,然后假设始终存在键/值对,请使用逻辑索引回收来对数值进行分组,检查它是否大于2并对非数字元素进行子集
v1 <- unlist(strsplit(data$Frequency, "[:,]"))
v1[c(TRUE, FALSE)][as.numeric(v1[c(FALSE, TRUE)]) >2]
#[1] "A1" "B1" "AA1" "C2"
或者我们可以使用tidyverse
选项
library(tidyverse)
filtered <- data %>%
separate_rows(Frequency, sep=",") %>%
separate(Frequency, into = c('group', 'freq'), convert = TRUE) %>%
filter(freq>2) %>%
pull(group)
filtered
#[1] "A1" "B1" "AA1" "C2"
condition <- paste(shQuote(filtered, type="cmd"), collapse=", ")
condition
#[1] "\"A1\" , \"B1\" , \"AA1\" ,\"C2\""
答案 1 :(得分:1)
x <- "A1:6,B1:4,AA1:3,BB1:2,AAA1:1,BBB1:1,A2:1,C2:3,D1:1" #create the string
y <- sapply(strsplit(x, ","), strsplit, ":") #split the string into single keys and values
dat <- data.frame(key = rep(NA, 9), value = rep(NA, 9)) #prepare empty dataframe
## fill dataframe
for(i in 1:length(y)){
dat[i, 1] <- y[[i]][1]
dat[i, 2] <- y[[i]][2]
}
给你
> dat
key value
1 A1 6
2 B1 4
3 AA1 3
4 BB1 2
5 AAA1 1
6 BBB1 1
7 A2 1
8 C2 3
9 D1 1
现在dat$key[dat$value > 2]
为您提供
> dat$key[dat$value > 2]
[1] "A1" "B1" "AA1" "C2"