簡體   English   中英

R:遍歷列名

[英]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)

試試這個兄弟

mutate_替換mutate

https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html

這為我工作:

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.

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