[英]R: looping through column names
我是Stata用戶,嘗試切換到R並進行常規的初學者奮斗。 我一直在嘗試(但失敗)做循環幾天,現在我投降了。 我想做的事情(循環):
從變量名列表開始
創建一個新變量
根據現有變量的值重新編碼該新變量
可能使用dplyr語法這樣做,但這不是必需的,只是為了與我的其余代碼保持一致。
這是我嘗試做的一個程式化示例。 在我的實際數據中,xx和xy變量源自應用於2個現有數據幀的join函數。
N <- 1000
df <- data.frame(x1 = rnorm(N),
x2.x = rnorm(N)+2,x2.y = rnorm(N)-2,
x3.x = rnorm(N)+3,x3.y = rnorm(N)-3)
varlist <- c("x2","x3")
lapply(varlist, function(x) {
df <- df %>% mutate(x = ifelse(x1 < 0, paste0(x,".y"),paste0(x,".x")) # generate varialble "x" values from existing x.x and x.y
})
當我運行代碼的lapply部分時,我收到錯誤消息
錯誤:“:df <-df%>%mutate(x = ifelse(x1 <0,paste0(x,”。y“),paste0(x,”。x“))#生成變量x“來自現有xx和xy的值}”
即使可以預料到...我確信代碼中存在許多錯誤,部分原因是因為我習慣於Stata中的宏,而R中沒有直接等效的宏。無論如何,如果您能指出我的意思,正確的方向太棒了!
您的代碼無法正常工作的原因是您的paste0(x, ".y")
實際上是使用.y
粘貼x
。 就是這樣,您不是要告訴它按該列對數據進行子集化。
您實際上應該做的是根據paste0(x, ".y")
生成的列名對數據進行子集設置。 因此,例如,要獲取數據x2.y
的列,您可以
df[, paste0(varlist[1], ".y")]
## and of course the same can be done for second item of varlist
# df[, paste0(varlist[2], ".y")]
現在我們知道了如何通過變量名對列進行子集化,並且因為您想學習如何在循環中編寫列,我們可以將varlist[1]
(和varlist[2]
)中的數字替換為“ looping”變量
這有兩種方法,一種使用for循環,另一種使用sapply
for(i in varlist){
df[, i] <- ifelse(df[, "x1"] < 0, df[, paste0(i, ".y")], df[, paste0(i, ".x")])
}
head(df)
# x1 x2.x x2.y x3.x x3.y x2 x3
# 1 -0.56047565 1.0042013 -2.5116037 2.849693 -2.8034502 -2.5116037 -2.803450
# 2 -0.23017749 0.9600450 -1.7630621 2.672243 -2.3498868 -1.7630621 -2.349887
# 3 1.55870831 1.9820198 -2.5415892 1.551835 -2.3289958 1.9820198 1.551835
# 4 0.07050839 1.8678249 -0.7807724 2.302715 -4.2841578 1.8678249 2.302715
# 5 0.12928774 -0.5493428 -1.8258641 5.598490 -5.0261096 -0.5493428 5.598490
# 6 1.71506499 3.0405735 -2.6152683 2.962585 -0.7946739 3.0405735 2.962585
您也可以使用*apply
來執行此操作,在這種情況下,我使用sapply
,以使其“簡化”結果(而lapply
會返回列表)
df[, varlist] <- sapply(varlist, function(x){
ifelse(df[, "x1"] < 0, df[, paste0(x, ".y")], df[, paste0(x, ".x")])
})
head(df)
# x1 x2.x x2.y x3.x x3.y x2 x3
# 1 -0.56047565 1.0042013 -2.5116037 2.849693 -2.8034502 -2.5116037 -2.803450
# 2 -0.23017749 0.9600450 -1.7630621 2.672243 -2.3498868 -1.7630621 -2.349887
# 3 1.55870831 1.9820198 -2.5415892 1.551835 -2.3289958 1.9820198 1.551835
# 4 0.07050839 1.8678249 -0.7807724 2.302715 -4.2841578 1.8678249 2.302715
# 5 0.12928774 -0.5493428 -1.8258641 5.598490 -5.0261096 -0.5493428 5.598490
# 6 1.71506499 3.0405735 -2.6152683 2.962585 -0.7946739 3.0405735 2.962585
set.seed(123) ## setting the seed as we're sampling
N <- 1000
df <- data.frame(x1 = rnorm(N),
x2.x = rnorm(N)+2,x2.y = rnorm(N)-2,
x3.x = rnorm(N)+3,x3.y = rnorm(N)-3)
這為我工作:
lapply(varlist, function(x)
df <- df %>% mutate(x = ifelse(x1 < 0, paste0(x,".y"),paste0(x,".x")) # generate varialble "x" values from existing x.x and x.y
))
您不需要大括號即可使用lapply
指定循環。 閱讀此內容以獲得有關lapply
語法的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.