Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在r中循环字符串_R_Loops - Fatal编程技术网

在r中循环字符串

在r中循环字符串,r,loops,R,Loops,我想知道我的代码出了什么问题,而不是解决方案。我希望循环一些字符串我的数据如下: id source transaction 1 a > b 6 > 0 2 J > k 5 3 b > c 4 > 0 我有一个列表,希望浏览这个列表,找到包含该元素的行并计算平均值 mylist <- c ("a", "b") 我不知道该由谁循环列表并将其发送到csv文件。我试过这个 myli

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

id    source    transaction

 1     a > b       6 > 0
 2     J > k       5
 3     b > c       4 > 0
我有一个列表,希望浏览这个列表,找到包含该元素的行并计算平均值

mylist <- c ("a", "b") 
我不知道该由谁循环列表并将其发送到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)

}

mylist我们可以使用
cSplit
拆分“源”并将数据集转换为“长”格式,然后指定“i”,按“源”分组,获得“事务”的
平均值(使用
data.table
方法)


或者另一个选项是
tidyr
中分离行
以转换为“长”格式,然后在按“源”分组后使用
dplyr
方法进行
汇总

library(tidyr)
library(dplyr)
separate_rows(df1, source) %>%
        filter(source %in% mylist) %>%
        group_by(source) %>% 
        summarise(avg  = mean(transaction))
cSplit(df2, 2:3,  " > ", "long")[source %in% my_list, .(avg = mean(transaction)), source]
#   source avg
#1:      a   6
#2:      b   2
更新 对于新的数据集('df2'),我们需要将两列拆分为“long”格式,然后获得按“source”分组的“transaction”的
mean

library(tidyr)
library(dplyr)
separate_rows(df1, source) %>%
        filter(source %in% mylist) %>%
        group_by(source) %>% 
        summarise(avg  = mean(transaction))
cSplit(df2, 2:3,  " > ", "long")[source %in% my_list, .(avg = mean(transaction)), source]
#   source avg
#1:      a   6
#2:      b   2

可将
循环的
修改为

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
for(mylist中的i){

KeepData Thank@akrun它适用于此示例,但我主要希望知道在我的情况下应用此代码有什么问题,在我的工作中,事务列也类似于2>3。我如何应用于that@MFR你是说交易栏是
character
class?从评论中不清楚hanks@akrun是否
%my_list
中的source!%计算不包括在我的列表中的源的平均值?@MFR您必须使用
!在%my_list
中的source%您确定新数据的预期平均值正确吗
for
循环的一个问题是检查
Cplit
的输出和它上面的一个,即grepl。使用
print
对于每个步骤,您都会了解原因,这里的
事务
列在
cSplit
之后被复制,而且它不是
事务
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))