【问题标题】:using grepl in R with ddply and transform在 R 中使用 grepl 和 ddply 和变换
【发布时间】:2014-04-30 09:04:03
【问题描述】:

关于我认为的语法的快速问题。我有一个 df,如下所示。我想确定一个人第一次得到苹果、猕猴桃或橙子的时间。为此,我使用以下代码创建了三个名为“apple1”、“kiwi1”和“orange1”的新变量:

ddply(z, "noms", transform, 
  apple1 = as.numeric(!duplicated(fruits) & fruits == "apple"))->z

但是,我实际上想使用 grepl 来识别我的水果,但无法使代码正常工作。这是我尝试过的:

ddply(z, "noms", transform, 
   apple20 = as.numeric(!duplicated(fruits) & z[grep('^app.*?', z$fruits),]))->z

ddply(z, "noms", transform, 
   apple20 = as.numeric(!duplicated(fruits) & grep('^app.*?', z$fruits)))->z

如果有人能指出我在这里出错的地方,那就太好了。谢谢!

样本 DF

 noms fruits kiwi1 orange1 apple1
1  john banana     0       0      0
2  john  apple     0       0      1
3  john  apple     0       0      0
4  john  apple     0       0      0
5  lucy   kiwi     1       0      0
6  lucy orange     0       1      0
7  lucy  apple     0       0      1
8  lucy  berry     0       0      0
9  mary  apple     0       0      1
10 mary  grape     0       0      0
11 mary orange     0       1      0
12 mary  apple     0       0      0
13  tom orange     0       1      0

【问题讨论】:

  • 你有 grep(它返回一个整数向量)而不是 grepl(它返回一个 TRUE / FALSE 值的向量)。同样,您正在使用& z[..],这可能会给您带来意想不到的结果,尤其是如果z 不能被强制转换为 TRUE/FALSE 值。
  • @RicardoSaporta 感谢您提供的信息 - 但我已将 grep 更改为 grepl 并且我仍然收到相同的错误“data.frame 中的错误(list(noms = c(1L, 1L, 1L, 1L), fruits = c(2L, 1L, : 参数暗示不同的行数:4, 30"。z 是 df 的名称
  • 错误告诉你你正在尝试组合两个不同长度的布尔向量
  • 想通了!我切换到使用 data.table,因为我的 df 有 >100 万行。所以这就是我的做法 - z
  • 你去!你确定你的逻辑吗?我不认为by 在这里完成任何事情(结果明智)

标签: r transform plyr grepl


【解决方案1】:

答案如下:

z<-z[,apple20 := grepl('app.*?', fruits), by='noms']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多