如果多個變數(以相同的后綴結尾)不包含 NA,我想對 R 資料幀進行子集化。
employee <- c('John Doe','Peter Gynn','Jolie Hope')
salary1 <- c(NA, 20400, 26800)
salary2 <- c(29045, NA, 78765)
date1 <- as.Date(c(NA,'2008-3-25','2007-3-14'))
date2 <- as.Date(c('2010-11-1',NA,'2007-3-14'))
employ.data <- data.frame(employee, salary1, salary2, date1, date2)
for (i in 1:2) {
assign("employ.data", i, subset(employ.data, !is.na(employ.data$date[i]) & !is.na(employ.data$salary[i])))
}
最終結果有望產生兩個獨立的資料幀,如下所示:
employ.data1:
| employee | salary1 | salary2 | date1 | date2 |
| Peter Gynn | 20400 | NA | 2008-03-25 | NA |
| Jolie Hope | 26800 | 78765 | 2007-03-14 | 2007-03-14 |
employ.data2:
| employee | salary1 | salary2 | date1 | date2 |
| John Doe | NA | 29045 | NA | 2010-11-01 |
| Jolie Hope | 26800 | 78765 | 2007-03-14 | 2007-03-14 |
提前致謝!
uj5u.com熱心網友回復:
(預先:通常最好處理幀串列,而不是使用assign動態創建物件。)
numfields <- grep("[0-9] $", colnames(employ.data), value = TRUE)
split(numfields, gsub(".*?([0-9] )$", "\\1", numfields))
# $`1`
# [1] "salary1" "date1"
# $`2`
# [1] "salary2" "date2"
out <- lapply(split(numfields, gsub(".*?([0-9] )$", "\\1", numfields)),
function(flds) employ.data[ complete.cases(subset(employ.data, select = flds)), ])
out
# $`1`
# employee salary1 salary2 date1 date2
# 2 Peter Gynn 20400 NA 2008-03-25 <NA>
# 3 Jolie Hope 26800 78765 2007-03-14 2007-03-14
# $`2`
# employee salary1 salary2 date1 date2
# 1 John Doe NA 29045 <NA> 2010-11-01
# 3 Jolie Hope 26800 78765 2007-03-14 2007-03-14
這將動態查找所有編號的欄位,但不可否認它不強制執行“對”。
uj5u.com熱心網友回復:
該non_na函式回傳名稱以 i 結尾的列中沒有缺失值的行。它首先將這些列名稱定義為 cn,然后使用 complete.cases 定義一個邏輯向量,該向量指示哪些行在這些列中沒有 NA,然后從epend.data 回傳這些行。
假設列中唯一的數字位于名稱的末尾,并且唯一的此類數字定義了可能的后綴。詞干是去除后綴后的那些唯一名稱。
我們假設第 1 列將從該計算中排除。我們使用 gsub/unique 來定義后綴和詞干。交替使用硬編碼suffixes <- as.character(1:2)和stems <- c("salary", "date").
最后在每個后綴上運行 non_na 創建一個串列,其 i 組件包含一個資料框,其中的行對應于 i。 L[[i]]將是 i 資料框。
non_na <- function(i) {
cn <- paste0(stems, i)
employ.data[complete.cases(employ.data[cn]), ]
}
nms <- names(employ.data)[-1]
suffixes <- unique(gsub("\\D", "", nms)) # c("1", "2")
stems <- unique(gsub("\\d", "", nms)) # c("salary", "date")
L <- Map(non_na, suffixes); L
給予:
$`1`
employee salary1 salary2 date1 date2
2 Peter Gynn 20400 NA 2008-03-25 <NA>
3 Jolie Hope 26800 78765 2007-03-14 2007-03-14
$`2`
employee salary1 salary2 date1 date2
1 John Doe NA 29045 <NA> 2010-11-01
3 Jolie Hope 26800 78765 2007-03-14 2007-03-14
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348107.html
上一篇:在for回圈中更新變數
下一篇:自定義類方法“不是函式”錯誤
