【问题标题】:Set Operations on Character Data (string of integers)对字符数据(整数字符串)设置操作
【发布时间】:2017-04-04 16:00:33
【问题描述】:

有谁知道如何设计一种快速计算两列相对重叠的方法?我想知道集合'b'中有多少'a'元素。理想情况下,会生成一列“c”来存储每一行​​的这些比较值。真的卡在这个了..

b <- c("20", "1, 8, 19, 20, 22, 23, 28, 34, 41", 
       "3, 8, 10, 11, 18, 20, 26, 37", 
       "1, 3, 6, 18, 21, 35", "NA", "1, 21, 33", "14, 37",
       "4, 14, 18, 23, 33, 37, 40", "14", 
       "4, 14, 20, 23, 33, 37, 40", 
       "2, 3, 5, 7, 8, 10, 14, 16, 18, 23, 25, 34, 40", 
       "6, 8, 10, 14, 19, 29, 33, 35, 36, 39, 41",
       "1, 20", "1, 28, 36", "14", 
       "1, 6, 33, 12, 39", "28", 
       "1, 6, 11, 13, 18, 19, 21, 28, 33, 35, 36, 39", 
       "35, 40", "20", "20, 38", "6, 8, 19, 22, 29, 32, 33, 34, 40",
       "1, 10, 21, 25, 33, 35, 36, 39, 40", "36")

a <- c("14", "10", "8, 39", "26, 39", "14, 20", "33, 36", "14", 
       "NA", "8, 39", "33, 36", "8, 39", "1, 36",  "10", "28, 33",
       "14, 20", "33, 40", "28, 34", "1, 36", 
       "8, 39",  "20", "14, 20", "29, 33", "36", "14")

df <- data.frame(a, b)

df$a <- as.character(df$a)
df$b <- as.character(df$b)

此函数适用于第 18 行,但不易使用 sapply 或等效函数进行扩展。

length(intersect(as.numeric(unlist(strsplit(df$a[18], ", "))),           
                 as.numeric(unlist(strsplit(df$b[18], ", "))))) /
length(as.numeric(unlist(strsplit(df$b[18], ", "))))
# gives
[1] 0.1666667

length(intersect(as.numeric(unlist(strsplit(df$a[5], ", "))), 
                 as.numeric(unlist(strsplit(df$b[5], ", "))))) / 
length(as.numeric(unlist(strsplit(df$b[5], ", "))))
# gives
[1] 0
Warning messages:
1: In intersect(as.numeric(unlist(strsplit(df$a[5], ", "))), as.numeric(unlist(strsplit(df$b[5],  :
  NAs introduced by coercion
2: NAs introduced by coercion 

【问题讨论】:

    标签: r character set-operations


    【解决方案1】:

    我不明白为什么需要使用as.numeric 进行转换。那就是给你警告的那个。 “NA”被视为数据框中的字符值,这是一个无法转换为数字的字符值。

    请注意,警告不是错误,因此您的代码实际上也适用于第 5 行(除非您期望 NA)。

    我会做以下事情:

    getCounts <- function(x,y){
      x <- strsplit(x,", ")[[1]]
      y <- strsplit(y,", ")[[1]]
      mean(y %in% x)
    }
    # gives
    > getCounts(df$a[5],df$b[5])
    [1] 0
    

    这基本上就是你所做的,但写得更清楚一点,并使用mean(..%in%..) 而不是length(intersect(..,..))/...

    为了在向量 a 和 b 上执行此操作,您可以使用 mapply

    out <- mapply(getCounts,df$a, df$b)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2015-01-19
      • 2013-10-23
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      相关资源
      最近更新 更多