我想知道我的代码有什么问题而不是解决方案。我希望循环一些字符串我的数据如下:
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
答案 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