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

Compare character in column with string in another column

有些日子以来,我试图找到一种方法,通过将一列中的字符与另一列中的字符串进行比较来对我的数据框进行子集化。

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

    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,""))

或类似,但比较始终为真。

我发现的所有示例仅适用于(并且有效)比较单个字符,例如"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)] 

您的代码不起作用的原因是

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

returns 一个列表。相反,您需要使用 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), ''))