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

时间:2015-02-04 15:28:24

标签: r dataframe string-comparison

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

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

    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。

我发现的所有示例仅应用(和工作)比较单个字符,例如&#34; K&#34;使用向量c进行硬编码(&#34; K&#34;,&#34; L&#34;,&#34; M&#34;)左右,但绝不是一个如何将其应用于数据框列和行的示例

我有点紧张......

任何人都知道我做错了什么?

更新

Thanx到下面的答案,我的代码现在看起来像这样,并做我需要的:

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 个答案:

答案 0 :(得分:2)

您的代码无法正常工作的原因是

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