代码之家  ›  专栏  ›  技术社区  ›  Bernd V.

将列中的字符与另一列中的字符串进行比较

  •  0
  • Bernd V.  · 技术社区  · 10 年前

    自从几天以来,我试图通过比较一列中的字符和另一列中字符串来找到一种方法来子集我的数据帧。

    如果字符不在字符串中,我想将值复制到新列。我到处搜索,尝试了很多例子,但出于某种原因,我没有让它在我的数据框架上工作。

        df <- structure(list(POLY = c("K3", "K3", "K3", "K4", "K4", "K4", "K4", 
        "K6", "K6", "K7", "K7", "K7", "L1", "L1", "L1"), FIX = c("O", 
        "K", "M", "M", "K", "O", "L", "K", "M", "K", "O", "M", "M", "L", 
        "O"), SESSTIME = c(310, 190, 181, 188, 151, 260, 268, 200, 259, 
        245, 180, 188, 259, 199, 244), CODE = c("KO", "KO", "KO", "KM", 
        "KM", "KM", "KM", "KM", "KM", "KO", "KO", "KO", "LMO", "LMO", 
        "LMO")), .Names = c("POLY", "FIX", "SESSTIME", "CODE"), row.names = c(42L, 
        44L, 46L, 115L, 116L, 117L, 133L, 225L, 231L, 269L, 270L, 328L, 
        420L, 425L, 431L), class = "data.frame")
    

    这是它的一部分:

        row.names   POLY    FIX SESSTIME    CODE    SESSTIME2
    1   42          K3      O   310         KO      NA
    2   44          K3      K   190         KO      NA
    3   46          K3      M   181         KO      ...
    4   115         K4      M   188         KM
    5   116         K4      K   151         KM
    6   117         K4      O   260         KM      NA
    7   133         K4      L   268         KM      268
    8   225         K6      K   200         KM      NA
    9   231         K6      M   259         KM
    10  269         K7      K   245         KO
    11  270         K7      O   180         KO
    12  328         K7      M   188         KO      188
    13  420         L1      M   259        LMO
    14  425         L1      L   199        LMO
    15  431         L1      O   244        LMO
    

    因此,当FIX不在CODE中时,SESSTIME的值应复制到SESSTIME2(列已预填充NA)

    例如,我用

      df$FIX %in% strsplit(as.character(df$CODE,""))
    

    但比较总是TRUE。

    我发现的所有示例都只适用于(并工作过)单个字符的比较,例如“K”与矢量c(“K”、“L”、“M”)等硬编码,但从来没有将其应用于数据帧列和行的示例。

    我有点紧张。。。

    有人知道我做错了什么吗?

    更新:

    感谢下面的答案,我的代码现在看起来像这样,并且可以满足我的需要:

    df3$SESSTIME2[!(mapply(function(i, j) length(grep(i, j)), df$FIX, df$CODE)) & is.na(df$SESSTIME2)] 
    
    <- 
    
    df$SESSTIME[!(mapply(function(i, j) length(grep(i, j)), df$FIX, df$CODE)) & is.na(df$SESSTIME2)] 
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   csgillespie Carl Witthoft    10 年前

    代码不工作的原因是

    strsplit(as.character(df$CODE,""))
    

    返回列表。相反,您需要使用 mapply 以检测是否存在匹配。

    这里我们使用了 grep 这允许更灵活的字符匹配

    # The values of FIX & CODE are passed to i and j
    mapply(function(i, j) length(grep(i, j)), df$FIX, df$CODE)
    

    或使用 %in%

    ## Suggested by akrun
    mapply('%in%', df$FIX,strsplit(as.character(df$CODE), ''))