我正在嘗試從我的 tibble 中洗掉任何包含“<chr [0]>”的串列
library(tidyverse)
df <- tibble(x = 1:3, y = list(as.character()),
z=list(as.character("ATC"),as.character("TAC"), as.character()))
df
#> # A tibble: 3 × 3
#> x y z
#> <int> <list> <list>
#> 1 1 <chr [0]> <chr [1]>
#> 2 2 <chr [0]> <chr [1]>
#> 3 3 <chr [0]> <chr [0]>
由reprex 包于 2022-02-15 創建(v2.0.1)
我希望我的小標題看起來像這樣
#> # A tibble: 3 × 3
#> x z
#> <int> <list>
#> 1 1 <chr [1]>
#> 2 2 <chr [1]>
#> 3 3 NA
任何幫助表示贊賞
uj5u.com熱心網友回復:
你可以做:
df %>%
select(where(~!all(lengths(.) == 0))) %>%
mutate(z = lapply(z, function(x) ifelse(length(x) == 0, NA, x)))
# A tibble: 3 x 2
x z
<int> <list>
1 1 <chr [1]>
2 2 <chr [1]>
3 3 <lgl [1]>
請注意,在您的 z 列中,您不能有第 1 行和第 2 行的串列元素和直接邏輯值 NA。整個列需要是一個串列。
如果 z 的所有元素只有一個元素,您可以添加另一行代碼mutate(z = unlist(z))。
TO 要求提供更動態的解決方案來傳遞幾列。
這是一個示例,我只是創建了另一個 z2 變數。通常,您可以使用 對幾列重復重新編碼across。
library(tidyverse)
df <- tibble(x = 1:3, y = list(as.character()),
z=list(as.character("ATC"),as.character("TAC"), as.character()),
z2 = z)
df %>%
select(where(~!all(lengths(.) == 0))) %>%
mutate(across(starts_with('z'), ~ lapply(., function(x) ifelse(length(x) == 0, NA, x))))
這使:
# A tibble: 3 x 3
x z z2
<int> <list> <list>
1 1 <chr [1]> <chr [1]>
2 2 <chr [1]> <chr [1]>
3 3 <lgl [1]> <lgl [1]>
uj5u.com熱心網友回復:
使用基數 R 的兩步法:
df <- tibble(x = 1:3, y = list(as.character()),
z=list(as.character("ATC"),as.character("TAC"), as.character()))
df <- df[apply(df, 2, function(x) any(lapply(x, length) > 0))] #Remove empty columns
df[apply(df, 2, function(x) lapply(x, length) == 0)] <- NA #Replace empty lists with NA
df
# A tibble: 3 x 2
x z
<int> <list>
1 1 <chr [1]>
2 2 <chr [1]>
3 3 <NULL>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/425642.html
上一篇:如何按字母順序對串列進行排序?
下一篇:列出nums的范圍除以N
