如何使用lapply将函数应用于数据框的列?

时间:2012-01-13 00:46:13

标签: r

如何使用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

3 个答案:

答案 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=",")