在r中循环遍历字符串

MFR

我想知道什么是错我的代码,而不是一个解决方案。我希望遍历一些字符串,我的数据如下:

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:在mean.default(KeepData $ transactions)中:参数不是数字或逻辑:返回NA

阿克伦

我们可以cSplit用来拆分“源”并将数据集转换为“长”格式,然后指定“ i”(按“源”分组),获得mean“交易”(使用data.table方法)

library(splitstackshape)
cSplit(df1, "source", " > ", "long")[source %in% mylist, .(avg = mean(transaction)), source]
#   source avg
#1:      a   6
#2:      b   5

separate_rowstidyr转换为“长”格式的另一种选择,然后使用“源”分组后dplyr方法summarise

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

更新资料

对于新的数据集('df2'),我们需要将两列均拆分为'long'格式,然后获取mean按'source'分组的'transaction'

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

for环可以被修改以

for(i in mylist) {
   KeepData <-  cSplit(df2, 2:3,  ">", "long")
   KeepData <- KeepData[grepl(i, source)]
   avg<- mean(KeepData$transaction)
   result <- list(i,avg )
   print(result)
   write.table(result ,file="C:/Users.csv", 
             append=TRUE,sep=",",col.names=FALSE,row.names=FALSE)
 }
#[[1]]
#[1] "a"

#[[2]]
#[1] 6

#[[1]]
#[1] "b"

#[[2]]
#[1] 2

数据

df1 <- structure(list(id = 1:3, source = c("a > b", "J > k", "b > c"
 ), transaction = c(6L, 5L, 4L)), .Names = c("id", "source", "transaction"
), class = "data.frame", row.names = c(NA, -3L))


df2 <- structure(list(id = 1:3, source = c("a > b", "J > k", "b > c"
), transaction = c("6 > 0", "5", "4 > 0")), .Names = c("id", 
"source", "transaction"), class = "data.frame", row.names = c(NA, 
-3L))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章