根据多个字母条件添加新列

时间:2016-04-22 18:51:07

标签: r dataframe grep

我有一个数据框df,我想根据Command中名字的几个条件来做子集。

  1. 如果名称包含PD
  2. 如果名称包含t1
  3. 如果名称包含t2
  4. 如果名称包含t1和PD
  5. 如果名称包含t2和PD
  6. 否则名称将是未知的
  7. 我希望这些子集作为我的情节的颜色。我不知道如何在所有这些条件下使用grep。这是我目前的df:

    'data.frame': 36919 obs. of 162 variables
    $TE                :int 38,41,11,52,48,75,.....
    $TR                :int 100,210,548,546,.....
    $Command          :factor W/2229 levels "_localize_PD","_localize_tre_t2","_abdomen_t1_seq","knee_pd_t1_localize"...
    

    但是我希望我的子集的输出产生一个像这样的新列:

    $TE                :int 38,41,11,52,48,75,.....
    $TR                :int 100,210,548,546,.....
    $NewCommand           :factor W/6 levels "PD","t2","t1","t1+PD",...
    

    我使用以下内容获取前3个子集:

    hast1=grepl("t1", df$Command)
    hast2=grepl("t2", df$Command)
    haspd=grepl("pd", df$Command)
    

    现在我不知道如何获得其他3个子集并使用这6个子集作为我的情节的颜色。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

如果你想提取特定字符串并在找不到模式时用NA替换,那么可能会这样做。

首先创建一个包含条件的向量,然后使用str_extract中的stringr返回模式。如果找不到模式,则返回NA

library(stringr)
v1 <- c('PD', 't1', 't2', 't1+PD', 't2+PD')
str_extract(df$command, paste(v1, collapse='|'))

答案 1 :(得分:0)

获取具有多个条件的名称的正确方法是:

hasPDT2 =grepl("(.*t2.*PD.*)|(.*PD.*t2.*)", df$Command)
hasPDT1 =grepl("(.*t1.*PD.*)|(.*PD.*t1.*)", df$Command)

然后我们可以创建一个新列来包含这些新名称:

df$new_name = NA
df[haspd,'new_name'] = 'pd'
df[hast1,'new_name'] = 't1'
df[hast2,'new_name'] = 't2'
df[hasPDT2,'new_name'] = 'pdt2'
df[hasPDT1,'new_name'] = 'pdt1'

这些命令的顺序很重要