NA我有一個包含's 的字串資料框。這是它的一個改變的子部分:
subdf
Col1 Col2
1 <NA> <NA>
2 Other Services <NA>
3 Other Services <NA>
4 Other Services Services of lawyers
5 Other Services <NA>
我想NA根據左/右的單元格值替換 's。我嘗試通過以下方式執行此操作:
subdf$Col1[subdf$Col2=="Services of lawyers"]
[1] NA NA
[3] NA "Other Services"
[5] NA
顯然,我在查找NA單元格時得到了不穩定的輸出。這使得無法充分替換適當的NA值。
na.omit()顯然不適用,因為我期望NA作為輸出來替換它。
uj5u.com熱心網友回復:
TL;博士
您可以使用which您的邏輯測驗來洗掉NA子集操作的意外結果:
subdf$Col1[which(subdf$Col2=="Services of lawyers")]
解釋
我認為我們可以像這樣復制您的問題。假設我有一個沒有NA值的資料框:
df1 <- data.frame(x = c("A", "B", "C"), y = 1:3)
如果我們想在 x == "A" 時找到 y 列的值,我們這樣做:
df1$y[df1$x == "A"]
#> [1] 1
這給了我們預期的結果。但是看看當有NA值時會發生什么x:
df2 <- data.frame(x = c("A", "B", NA), y = 1:3)
你現在期待什么結果?
df2$y[df2$x == "A"]
#> [1] 1 NA
這似乎出乎意料。畢竟,當 x 為“A”時,我們只想要 y 的值,但現在我們有一個長度為 2 的結果,它既不匹配資料幀的長度,也不匹配資料幀中“A”的數量。為什么?
這是因為我們通過邏輯向量進行子集化df2$x == "A",即:
df2$x == "A"
#> [1] TRUE FALSE NA
因此,如果我們以此為子集,我們將選擇第一項,省略第二項,但不會省略第三項。如果您對 進行子集化NA,NA則回傳 an。這就是我們回傳兩個專案的原因。
抑制這種情況的簡單方法是將邏輯測驗包裝在 中which,因為它將轉換為數字索引并悄悄洗掉NA值:
df2$y[which(df2$x == "A")]
#> [1] 1
uj5u.com熱心網友回復:
你可以試試
library(dplyr)
table <- data.frame("Col1"=c(NA, "B", "C"), "Col2"=c("A'", "B'", "C'"))
table %>%
mutate(
Col1 = ifelse(is.na(Col1), stringr::str_extract(Col2, "[A-Z] "), Col1)
)
編輯新資料:
df <- tibble::tribble(~Col1, ~Col2,
"<NA>", "<NA>",
"Other Services", "<NA>",
"Other Services", "<NA>",
"<NA>", "Services of lawyers",
"Other Services", "<NA>"
)
df%>%
mutate(
Col1 = ifelse(Col1 == "<NA>", Col2, Col1)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/474759.html
