我需要根據列名是否包含某個字串來更新多個資料框中多個列中的值。
我有一個需要更新的資料框列串列,我想知道如何遍歷該串列并動態進行更新。我已經嘗試過“for”回圈和“lapply”但沒有任何運氣......下面是我試過的示例代碼......
目標是確定列名稱是否包含“X”或“Y”,然后用 1 或 2 更新該列中的值。
在我的真實示例中,我有 60 多個資料框和 100 多個列,這是一個簡化版本——因此理想情況下,這可能是一個回圈或利用一個函式。
非常感謝任何幫助!
#create columns and 2 data frames
grp = c("A","A","A","A","A","A","A")
col1 =c(10,21,33,31,423,132,245)
col2X = c(0,0,NA,1.5,1.75,1,NA)
col3 = c(10,30,NA,1.0,1.3,1.4,50)
col4 = c(0,0,NA,1.5,1.75,1,NA)
col5Y = c(1,1.25,0,1.5,0,NA,0)
df1 = data.frame(grp,col1,col2X,col3,col4,col5Y)
first = c("A","A","A","A","A","A","A")
ind1 =c(10,21,33,31,423,132,245)
ind2X = c(0,0,NA,1.5,1.75,1,NA)
ind3 = c(10,30,NA,1.0,1.3,1.4,50)
ind4 = c(0,0,NA,1.5,1.75,1,NA)
ind5Y = c(1,1.25,0,1.5,0,NA,0)
df2 = data.frame(first,ind1,ind2X,ind3,ind4,ind5Y)
#list of columns I want to update
lis = c('df1$col2X','df1$col5Y','df2$ind2X','df2$ind5Y')
#logical loop to identify whether column name contains 'X' or 'Y' and then update the values in that column to either a 1 or 2.
for (i in lis) {
i <- ifelse( grepl("X", i, fixed = TRUE),
1 ,
2)
}
This is the desired changes for df1 and df2...
grp col1 col2X col3 col4 col5Y
1 A 10 1 10.0 0.00 2
2 A 21 1 30.0 0.00 2
3 A 33 1 NA NA 2
4 A 31 1 1.0 1.50 2
5 A 423 1 1.3 1.75 2
6 A 132 1 1.4 1.00 2
7 A 245 1 50.0 NA 2
first ind1 ind2X ind3 ind4 ind5Y
1 A 10 1 10.0 0.00 2
2 A 21 1 30.0 0.00 2
3 A 33 1 NA NA 2
4 A 31 1 1.0 1.50 2
5 A 423 1 1.3 1.75 2
6 A 132 1 1.4 1.00 2
7 A 245 1 50.0 NA 2
uj5u.com熱心網友回復:
如果您想將所有列中的值替換為“X”為 1,“Y”為 2,您可以嘗試:
df1[, grep("X", names(df1))] <- 1
df1[, grep("Y", names(df1))] <- 2
輸出:
grp col1 col2X col3 col4 col5Y
1 A 10 1 10.0 0.00 2
2 A 21 1 30.0 0.00 2
3 A 33 1 NA NA 2
4 A 31 1 1.0 1.50 2
5 A 423 1 1.3 1.75 2
6 A 132 1 1.4 1.00 2
7 A 245 1 50.0 NA 2
要將其應用于多個資料框,您可以將其包裝在一個函式中。然后將資料幀存盤在串列中并使用lapply
rep_fun <- function(df){
df[, grep("X", names(df))] <- 1
df[, grep("Y", names(df))] <- 2
df
}
df_list <- list(df1, df2)
lapply(df_list, function(x) rep_fun(x))
輸出
> lapply(df_list, function(x) rep_fun(x))
[[1]]
grp col1 col2X col3 col4 col5Y
1 A 10 1 10.0 0.00 2
2 A 21 1 30.0 0.00 2
3 A 33 1 NA NA 2
4 A 31 1 1.0 1.50 2
5 A 423 1 1.3 1.75 2
6 A 132 1 1.4 1.00 2
7 A 245 1 50.0 NA 2
[[2]]
first ind1 ind2X ind3 ind4 ind5Y
1 A 10 1 10.0 0.00 2
2 A 21 1 30.0 0.00 2
3 A 33 1 NA NA 2
4 A 31 1 1.0 1.50 2
5 A 423 1 1.3 1.75 2
6 A 132 1 1.4 1.00 2
7 A 245 1 50.0 NA 2
如果您不想走串列路線并想使用回圈:
df_names <- c("df1", "df2")
for(xx in df_names){
assign(xx, rep_fun(get(xx)))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/536593.html
標籤:rfor循环if语句申请
