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