循环遍历r中的字符串

时间:2016-11-11 01:51:09

标签: r loops

我想知道我的代码有什么问题而不是解决方案。我希望循环一些字符串我的数据如下:

id    source    transaction

 1     a > b       6 > 0
 2     J > k       5
 3     b > c       4 > 0

我有一个列表,希望查看此列表并找到包含该元素的行并计算平均值。

mylist <- c ("a", "b") 

所以我想要的输出将是列表中的一个元素是

source  avg
a        6 
b        2      

我不知道是谁循环列表并将它们发送到csv文件。我试过这个

mylist <- c( "a", "b" )

for(i in mylist)
{

  KeepData <- df [grepl(i, df$source), ]
   KeepData <- cSplit(KeepData, "transaction", ">", "long")

  avg<- mean(KeepData$transactions)
  result <- list(i,avg )

  write.table(result ,file="C:/Users.csv", append=TRUE,sep=",",col.names=FALSE,row.names=FALSE)

}

但它通过以下警告给我“NA”结果

  

警告消息:1:在mean.default(KeepData $ transactions)中:
  参数不是数字或逻辑:返回NA 2:In   mean.default(KeepData $ transactions):参数不是数字或   逻辑:返回NA

1 个答案:

答案 0 :(得分:3)

我们可以使用cSplit来分割来源&#39;并将数据集转换为&#39; long&#39;格式,然后指定&#39; i&#39;,按来源&#39;分组,获取&#39;事务&#39; (使用mean方法)

data.table

另一个选项是来自library(splitstackshape) cSplit(df1, "source", " > ", "long")[source %in% mylist, .(avg = mean(transaction)), source] # source avg #1: a 6 #2: b 5 的{​​{1}}转换为&#39; long&#39;格式,然后在使用&#39;来源&#39;

进行分组后,使用separate_rows方法tidyr
dplyr

更新

对于新数据集(&#39; df2&#39;),我们需要将这两列拆分为“长”和“长”。格式,然后获取&#39;交易的summarise&#39;按来源&#39;

分组
library(tidyr)
library(dplyr)
separate_rows(df1, source) %>%
        filter(source %in% mylist) %>%
        group_by(source) %>% 
        summarise(avg  = mean(transaction))

mean循环可以修改为

cSplit(df2, 2:3,  " > ", "long")[source %in% my_list, .(avg = mean(transaction)), source]
#   source avg
#1:      a   6
#2:      b   2

数据

for