我正在匯入和整理大量的資料集,并試圖精簡我的代碼。
雖然這些資料集是相似的,但較新的資料集有不同的列標題。
例如:
df1 <- data. frame(a = c(1。 1, 3)。 b = 4。 6, c == 5。 7)
df2 <- data. frame(a = c(1。 2。 1, 1)。 b1 = 1。 4, c = 8。 11)
我創建了一個函式來整理這些資料,確保在有b1的地方,b1被重命名為b,并在所有情況下過濾a=1,如下所示(這是各種位的簡化版本)。
fun1 < - function(x) {
if(any(grep('b1'。 colnames(x) > 0)) {
x %>%
filter(a == "1") %>%
重命名(b = b1)
} else {{/span
x %>%
filter(a == 1)
}
}
fun1(df1)
然而,這仍然需要在函式中重復filter(a == 1)的步驟,用于if()和else()
因此,我希望filter(a == 1)所有的資料集,然后應用if()、else()、rename()階段,例如:
fun1 < - function(x) {
x%>%
filter(a == "1") %<%
if(any(grep('b1'。 colnames(x) > 0)) {
rename(x,b =b1)
} else {>
}
}
fun1(df1)
然而,這將回傳以下錯誤:
Error in if (. ) any(grep("b1"/span>。 colnames(x) > 0) else { 。
引數不能解釋為邏輯的
此外:警告資訊:
在if (. ) any(grep("b1"/span>。 colnames(x) > 0) else { 。
該條件具有長度 > 1,只有第一個元素將被使用
我有什么問題嗎?
謝謝 杰克
uj5u.com熱心網友回復:
你也可以將if else部分連鎖起來,如下所示:
fun1 < - function(x) {
x%>%
{if('b1'%in% names(. ))重命名(。 , b = b1) else 。 } %>% .
filter(a == 1)
}
fun1(df2)
a bc
1 1 1 8
2 1 3 10
3 1 4 11
fun1(df1)
a b c
1 1 4 5
2 1 5 6
uj5u.com熱心網友回復:
我們可以使用dplyr與rename_with和filter,所以我們得到一個功能更多的,并且可以在任何變數中的意外名稱下作業。
首先用一個只從名字中提取字母的函式來重命名,然后過濾a==1,所有這些都在一個管道鏈中。
library(dplyr)
my_wrangler<-function(df){>
df %>% rename_with(/span>. cols=everything()。 ~str_extract(. x, "[[:alpha:]]") %>%。
filter(a==1)
}
> my_wrangler(/span>df2)
a b c
1 1 1 8
2 1 3 10
3 1 4 11
uj5u.com熱心網友回復:
更新的解決方案
更新的解決方案
親愛的Onyambu先生建議的更簡潔的方法。
我們也可以像這樣使用基礎R管來做(靈感來自于Onyambu先生,一如既往)。我定義了一個自定義函式,你只需要在管道行的開始處改變資料集: 或者用 uj5u.com熱心網友回復:
標籤:df2 |>
subset(a == 1) |>/span>
()setNames(. , sub('^b1$', 'b', names(/span>. ))))。
a b c
1 1 1 8
3 1 3 10
4 1 4 11
df1 |>
{(x) {
tmp < -子集(x, a == 1)
if("b1" %in% colnames(tmp)) {
names(tmp)[names/span>(tmp) == "b1"】 <。 - "b">
}
臨時工
}
}()
a b c
1 1 4 5
2 1 5 6
df2: a b c
1 1 1 8
3 1 3 10
4 1 4 11
fun1 < - function(x) {
存盤<- x %> %filter(a == "1")
if(any(grep('b1'。 colnames(store) > 0)) {
rename(store,b = b1)
}
}
fun1(df2)
a bc
1 1 1 8
2 1 3 10
3 1 4 11
