簡體   English   中英

如何使用lapply將函數應用於數據框的列?

[英]How can I apply a function to a column of a data frame using lapply?

如何使用lapply重寫以下代碼中的for循環?

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
# 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列中的值替換為其新值。

由於您使用的標頭= FALSE,因此我假定列1的名稱為V1。 在這種情況下,您不需要循環或lapply(),因為可以對操作進行矢量化,如下所示:

transactions$V1 <- paste(sort(unlist(strsplit(transactions$V1, ","))),
                         collapse = ",")

編輯:我不知道粘貼/排序/取消列表/拼寫是否有效,因為我看不到原始數據。 我的觀點是,您不需要循環或適用於轉換數據框列。

編輯:好的,我得到了代碼應該做的事情,是的,由於unlist(),上述方法不起作用。 但是我敢肯定,有一個向量化的解決方案...如果我找到,將會進行編輯。

編輯:對:我能拿出的最好的是雙sapply()。 一個用於對交易$ V1進行拆分和分類,另一個用於將其粘貼回去。 它很丑。 這里是:

transactions$V1 <- sapply(sapply(strsplit(transactions$V1, ","), sort), 
                          function(x) paste(x, collapse = ","))

看起來您想對transactions[, 1]的各個逗號分隔的組件進行排序。

transactions[, 1] <- sapply(lapply(strsplit(transactions[, 1], ","),
                                   sort),
                            paste, collapse=",")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM