【问题标题】:Compare data frame with vector and create new variable for matched value将数据框与向量进行比较并为匹配值创建新变量
【发布时间】:2016-08-12 15:43:20
【问题描述】:

我有一个包含 600 行的数据框,其中有一个字符变量 (ids),其中包含用逗号分隔的数字。

name    ids
x     8,5,23,56,78,44,54
y      5,7,23,44
z      8,44,2

我想将上述值与包含数值的三个不同向量进行比较。

a=c(5,7,9,3)
b=c(8,23,78,66,4)
c=c(44,54,2,90)

我需要为数据框中的向量创建三个新列,其中包含在每个向量中匹配多次的 ids 值

name    ids                a          b           c
x    8,5,23,56,78,44,54    NA      8,23,78       44,54
y    5,7,23,44             5,7       NA           NA
z    8,44,2                NA        NA           44,2

我真的不知道如何比较它,因为两者都是不同的类型,一旦我比较以及如何获得像上面这样的单独值。

【问题讨论】:

    标签: r compare dplyr


    【解决方案1】:

    我们可以将向量放在list 中,循环遍历它们,split 将 'data.frame' 中的 'ids' 列按 ',' 放入list,根据元素对向量进行子集化找到%in%拆分list,当子集的length为1或else我们paste(即toString)时创建一个异常返回NA(即toString)并将输出分配回新列在“df1”中。

    df1[letters[1:3]] <- lapply(list(a, b, c), function(x) 
         sapply(strsplit(df1$ids, ","), function(y) {
           x1 <- x[x %in% as.numeric(y) ]
         if(length(x1)>1) toString(x1) else NA 
    }))
    

    【讨论】:

    • 完美无瑕的 akrun。还有一件事,而不是字母,说如果我想将列命名为向量的名称应该做什么。如果每个向量分别被命名为商业、常规、紧急而不是a、b、c。非常感谢。
    • @ssan 你可以使用df1[c("a", "b", "c")] &lt;- 。如果只有几列,手动执行此操作很容易。
    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2021-01-04
    • 1970-01-01
    相关资源
    最近更新 更多