【问题标题】:Compare character in column with string in another column将列中的字符与另一列中的字符串进行比较
【发布时间】:2015-04-04 04:39:37
【问题描述】:

从某些天开始,我尝试通过将列中的字符与另一列中的字符串进行比较来找到一种方法来对我的数据框进行子集化。

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

    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)] 

【问题讨论】:

    标签: r dataframe string-comparison


    【解决方案1】:

    你的代码不起作用的原因是因为

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

    【讨论】:

    • 非常感谢!显然,到目前为止,我设法避免使用所有这些应用程序和功能。现在必须学习这个概念!顺便提一句。为了实现不匹配,我使用了“!(....)”,它工作得很好......只是为了完整性。
    • Errm,第二个问题(如果允许):有没有更优雅的方式将值复制到另一列?目前,我产生了这个怪物: df3$SESSTIME2[!(mapply(function(i, j) length(grep(i, j)), df$FIX, df$CODE)) & is.na(df$SESSTIME2 )]
    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2022-06-14
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多