如何使用for
重写以下代码段中的lapply
循环?
transactions <- read.table(file = file("stdin"), header = FALSE, stringsAsFactors = FALSE)
for (i in 1:nrow(transactions)) {
transactions[i,1] <- paste(sort(unlist(strsplit(transactions[i,1], ","))), collapse = ",")
}
如果您发现使用某些输入数据更容易,请使用以下内容作为stdin的内容:
a,b
b,c,a
a,b,c
b,a,c
a,b,c,d
a,d,b,c
答案 0 :(得分:2)
# Sample data
n <- 10
d <- data.frame(
a = unlist( lapply(
1:n,
function (u) { paste( sample(LETTERS, 5), collapse="," ) }
)),
b = 1:n,
stringsAsFactors = FALSE
)
# Sort the lists
d[,1] <- unlist(lapply(
strsplit(d[,1], ","), # List with the data to process
function (u) { paste(sort(u), collapse=",") } # Function to apply to each element
))
答案 1 :(得分:1)
如果我正确理解您的代码,您希望将事务第1列中的值替换为新值。
由于您使用了header = FALSE,我将假设第1列的名称是V1。在这种情况下,您不需要循环或lapply(),因为操作可以像这样进行矢量化:
transactions$V1 <- paste(sort(unlist(strsplit(transactions$V1, ","))),
collapse = ",")
编辑:我不知道粘贴/排序/未列表/ strsplit是否有效,因为我看不到原始数据。我的观点是,您不需要循环或应用于转换数据框列。
编辑:好的,我得到了代码应该做的事情,是的,由于unlist(),上面的代码不起作用。但我确信有一个矢量化的解决方案......如果我找到一个就会编辑。
编辑:右:我能想到的最好的是双重祝福()。一个用于拆分和分类交易$ V1,另一个用于将其重新粘贴在一起。它很丑。这是:
transactions$V1 <- sapply(sapply(strsplit(transactions$V1, ","), sort),
function(x) paste(x, collapse = ","))
答案 2 :(得分:1)
看起来您想要对transactions[, 1]
。
transactions[, 1] <- sapply(lapply(strsplit(transactions[, 1], ","),
sort),
paste, collapse=",")