在R中使用grepl与ddply和transform

在R中使用grepl与ddply和transform,r,transform,plyr,grepl,R,Transform,Plyr,Grepl,关于语法的快速问题。我有一个df,如下所示。我想确定一个人第一次得到苹果、猕猴桃或桔子的时间。为此,我使用以下代码创建了三个名为“apple1”、“kiwi1”和“orange1”的新变量: ddply(z, "noms", transform, apple1 = as.numeric(!duplicated(fruits) & fruits == "apple"))->z 然而,我实际上想用grepl来识别我的水果,但无法让代码正常工作。这就是我尝试过的: ddply(z

关于语法的快速问题。我有一个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
答案如下:

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

zyou拥有
grep
(返回整数向量)而不是
grepl
(返回真/假值向量)。类似地,您正在使用
&z[…]
,这可能会给您带来意外的结果,特别是当
z
无法强制转换为真/假值时。@Ricardosporta感谢您提供的信息-但我已将grep更改为grepl,并且在data.frame(list)(noms=c(1L,1L,1L,1L),fruits=c)中仍然会出现相同的错误(2L,1L,:参数表示不同的行数:4,30“.z是DFT的名称错误告诉您,您正在尝试组合两个不同长度的布尔向量。我找到了它!我切换到使用data.table,因为我的df有超过100万行。下面是我如何做到的-ZT开始了!您确定您的逻辑吗?我不认为
by
在这里完成了任何事情(结果方面)