在选择R数据帧行

时间:2017-07-07 19:29:16

标签: r grep

我正在根据其他单元格中的值更改数据框中df $ AccPat列中的值。起点:

      AccVs               Verb              Acc      LVs AccPat
0         2            pádsáda               fa        1      u
1         1     pácccaiiidncll               ma        2      u
2         0                saa               un        1      u
3         0               liss               un        0      u
4         1           litátoko               fa        0      u
5         1           wupágaak               ma        1      u

我可以结合多种因素,因此:

df[df$Acc == "fa" & df$LVs == "0",]$AccPat <- "a"

      AccVs               Verb              Acc      LVs AccPat
0         2            pádsáda               fa        1      u
1         1     pácccaiiidncll               ma        2      u
2         0                saa               un        1      u
3         0               liss               un        0      u
4         1           litátoko               fa        0      a
5         1           wupágaak               ma        1      u

或者我可以使用grep在一列中选择与正则表达式匹配的行:

df[grep("^pá", df$Verb),]$AccPat <- "p"

      AccVs               Verb              Acc      LVs AccPat
0         2            pádsáda               fa        1      p
1         1     pácccaiiidncll               ma        2      p
2         0                saa               un        1      u
3         0               liss               un        0      u
4         1           litátoko               fa        0      a
5         1           wupágaak               ma        1      p

但是我想同时做两个,所以只选择与df $ AccVs中值为“1”的上述正则表达式匹配的行。

      AccVs               Verb              Acc      LVs AccPat
0         2            pádsáda               fa        1      u
1         1     pácccaiiidncll               ma        2      b
2         0                saa               un        1      u
3         0               liss               un        0      u
4         1           litátoko               fa        0      a
5         1           wupágaak               ma        1      u

我曾经认为这是不可能的,但this question让我觉得不是。但是,那里给出的解决方案对我不起作用。

df[grep("^pá", df$Verb) & df$AccVs == "1"]$AccPat <- "b" 

导致错误“未选择的列选择”和“较长的对象长度不是较短的对象长度的倍数”,并且

df[grep("^pá", df$Verb) & df$AccVs == "1",]$AccPat <- "b" 

尝试打印我的整个数据帧(比这个样本大得多),并且还会导致错误“较长的对象长度不是较短对象长度的倍数”。

注意:我要检查的许多值都是字符串,所以我需要一个适用于字符串的解决方案。我没有做任何数字化的事情,所以如果我将整数视为咒语就没问题。

1 个答案:

答案 0 :(得分:0)

这是您的数据框:

df <- data.frame(AccVs=c(2,1,0,0,1,1), Verb=c("pádsáda","pácccaiiidncll","saa","liss","litátoko","wupágaak"),
                 Acc=c("fa","ma","un","un","fa","ma"),
                 LVs=c(1,2,1,0,0,1),
                 AccPat=rep("u",6),
                 stringsAsFactors=F)

grep==会返回不同的类:

grep("^pá", df$Verb)
[1] 1 2

df$AccVs == "1"
[1] FALSE  TRUE FALSE FALSE  TRUE  TRUE

使用grepl返回logical

grepl("^pá", df$Verb)
[1] TRUE TRUE FALSE FALSE FALSE FALSE

结果:

  AccVs           Verb Acc LVs AccPat
1     2        pádsáda  fa   1      u
2     1 pácccaiiidncll  ma   2      b
3     0            saa  un   1      u
4     0           liss  un   0      u
5     1       litátoko  fa   0      u
6     1       wupágaak  ma   1      u