【问题标题】:Combine grep and factor from different columns in selecting R dataframe rows在选择 R 数据框行时结合来自不同列的 grep 和因子
【发布时间】:2017-07-07 19:29:15
【问题描述】:

我正在根据其他单元格中的值更改数据框中 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" 

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

注意:我要检查的许多值都是字符串,因此我需要一个适用于字符串的解决方案。我没有做任何数字,所以如果我将整数视为字符串就可以了。

【问题讨论】:

  • 我确实有一个笨拙的解决方法:创建一个带有标志以匹配正则表达式的新列,然后将其用作组合的因素,但似乎没有必要这样做那个。

标签: r regex


【解决方案1】:

这是您的数据框:

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

【讨论】:

  • grepl 正是我需要的,我不知道它存在。如果你这样回答,我会接受的!
猜你喜欢
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2012-02-04
  • 2019-06-09
  • 1970-01-01
  • 2021-12-03
  • 2020-09-25
相关资源
最近更新 更多