我想知道什么是错我的代码,而不是一个解决方案。我希望遍历一些字符串,我的数据如下:
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_rows
从tidyr
转换为“长”格式的另一种选择,然后使用“源”分组后的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] 删除。
我来说两句