簡體   English   中英

R dplyr:將列更改為特定行范圍

[英]R dplyr: mutate a column for specific row range

我正在嘗試為特定范圍內的行修改列的值。 這是我的數據:

df = data.frame(names = c("george","michael","lena","tony"))

我想使用dplyr執行以下操作:

df[2:3,] = "elsa"

我對此的嘗試如下,但似乎不起作用:

df = cbind(df, rows = as.integer(rownames(df)))
dplyr::mutate(df, ifelse(rows %in% c(2,3), names = "elsa" , names = names))

結果如下:

Error: unused arguments (names = "elsa", names = c(1, 3, 2, 4))

感謝您的任何建議。

這個問題有點模糊,但是我認為OP試圖使用索引來替換數據幀中的某些值。 如上面的注釋所述,示例數據框的列由一個因素變量組成,這使得替換值的行為與您預期的不同。 有兩種方法可以解決此問題。

第一種(更冗長的方法)是強制df$names是字符變量而不是因子。 然后使用索引選擇要更改的值並替換它:

df$names = as.character(df$names)
df$names[c(2,3)] = "elsa"

另外,您可以設置stringsAsFactors = TRUE並按上述步驟進行。

df = data.frame(names = c("george","michael","lena","tony"), stringsAsFactors = FALSE)
df$names[c(2:3)] = "elsa"

   names
1 george
2   elsa
3   elsa
4   tony

一定要檢查?data.frame以獲得更完整的說明。

因子答案更快,但是您可以使用dplyr這樣做(請注意,列必須character類型,而不是factor ):

df <- data.frame(names = c("george","michael","lena","tony"), stringsAsFactors=F)
oldnames <- c("michael", "lena")
df <- mutate(df, names=ifelse(names %in% oldnames, "elsa", names))

另一種方法是做類似的事情

oldnames <- c("michael", "lena")
df$names[df$names %in% oldnames] <- "elsa"

names顯式轉換為字符向量,並使用replace

df %>% mutate(names = replace(as.character(names), 2:3, "elsa"))

注意:如果names已經是一個字符向量,我們可以只做:

df %>% mutate(names = replace(names, 2:3, "elsa"))

我們可以使用data.table做到這data.table 將'data.frame'轉換為'data.table'( setDT(df) ),將行索引指定為i然后將( := )'elisa'分配給'names'。 正如OP關於大型數據集所提到的,使用data.table:=將非常快。

library(data.table)
setDT(df)[2:3, names := 'elisa']
df
#    names
#1: george
#2:  elisa
#3:  elisa
#4:   tony

暫無
暫無

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

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