[英]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.