簡體   English   中英

如何創建一個函數來創建一個包含組合觀察的列

[英]How to make a function that creates a column with combined observations

我顯然是數據清理的新手,並且在清理調查導出時遇到了麻煩。 這就是我的數據框以原始形式顯示的樣子。

Var1          Colname1  Colname2  Colname3  Var2
Observation1  NA        NA        Val1      Val_1
Observation2  NA        Val2      NA        Val_1
Observation3  Val3      NA        NA        Val_1
Observation4  Val4      Val5      NA        Val_2
Observation5  NA        NA        Val6      Val_2

我想將我的數據清理成這樣:

Var1         SubVar1 Var2
Observation1 Val1    Val_1
Observation2 Val2    Val_1
Observation3 Val3    Val_1
Observation4 Val4    Val_2
Observation4 Val5    Val_2
Observation5 Val6    Val_2

我試圖刪除 NA 值:

df1 <- na.omit(c(Colname1, Colname2, Colname3))

問題是它會刪除所有行,因為每一行都有一個 NA。 我還嘗試連接值,然后使用 separate_rows() 函數,但這僅適用於在一列中只有一個值的觀察。 對於在多列中包含值的觀察(請參閱 Observation4),這將不起作用。

感謝你們提供的任何幫助!

嘗試,

data %>% mutate(SubVar1 = coalesce(Colname1,Colname2,Colname3)) %>%
         select(Var1, SubVar1, Var2)

我會認為這是從寬到長的樞軸(重塑)操作:

library(dplyr)
library(tidyr)

data %>%
  pivot_longer(cols = Colname1:Colname3, values_to = "SubVar1") %>%
  filter(!is.na(SubVar1)) %>%
  select(Var1, SubVar1, Var2)
# # A tibble: 6 × 3
#   Var1         SubVar1 Var2 
#   <chr>        <chr>   <chr>
# 1 Observation1 Val1    Val_1
# 2 Observation2 Val2    Val_1
# 3 Observation3 Val3    Val_1
# 4 Observation4 Val4    Val_2
# 5 Observation4 Val5    Val_2
# 6 Observation5 Val6    Val_2

要了解發生了什么,請運行第一行,然后是第一行和第二行,然后是第一行、第二行和第三行,等等。有關指定要透視的列的其他幾個選項,請參閱?pivot_longer - 您可以明確命名,使用 a名稱模式,如names_pattern = "Colname"或使用Colname1:Colname3來選擇連續的列,就像我上面所做的那樣。

我們可以通過行/列索引以矢量化方式使用base R 將列名為'Colname'的列子集,然后用max.col獲取每行非NA元素的列索引, cbind行序列,提取對應的元素,創建新的data.frame

i1 <- startsWith(names(df1), "Colname")
data.frame(df1['Var1'], SubVar1 = df1[i1][cbind(seq_len(nrow(df1)), 
      max.col(!is.na(df1[i1]), "first"))], df1['Var2'])
          Var1 SubVar1  Var2
1 Observation1    Val1 Val_1
2 Observation2    Val2 Val_1
3 Observation3    Val3 Val_1
4 Observation4    Val4 Val_2
5 Observation5    Val6 Val_2

數據

df1 <- structure(list(Var1 = c("Observation1", "Observation2", "Observation3", 
"Observation4", "Observation5"), Colname1 = c(NA, NA, "Val3", 
"Val4", NA), Colname2 = c(NA, "Val2", NA, "Val5", NA), Colname3 = c("Val1", 
NA, NA, NA, "Val6"), Var2 = c("Val_1", "Val_1", "Val_1", "Val_2", 
"Val_2")), class = "data.frame", row.names = c(NA, -5L))

暫無
暫無

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

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