查找值大于2的键

时间:2017-11-28 12:28:53

标签: r string

  • 我有一个键值对,如下所示,是字符串

     > 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
    

2 个答案:

答案 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"