2017-08-25 68 views
0

我正在嘗試編寫一個循環,該循環將一個表(表x)的列中的變量作爲列名稱使用,然後將這些名稱用作另一個表根據特定標準填充這些列。這是我的代碼。我一直在嘗試使用For循環。在r上使用循環來創建和填充新列

for(player in x) 
    { 
    y$paste0(x$player)<-ifelse(y$Playing=="True", 1, 0) 
    } 

我正的錯誤是「在複雜的分配功能失效」

我與運動數據的工作。我的最終目標是計算每個球員在場上的傳球數量。我需要爲隊員在場上分配變量1,如果他們在場上則需要0。任何幫助將不勝感激。

+0

請仔細閱讀[如何使R中一個偉大的可重複的例子?(https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Masoud

回答

1

如何只:

# create df1 with 10 random TRUE/FALSE values 
df1 <- data.frame(Player= sample(c(TRUE,FALSE),10,TRUE)) 

df1$playing <- sapply(df1$Player, function(x) ifelse(x==TRUE,1,0)) 

更新:

require(tidyr) 

df1 <- data.frame(ID = seq(1,35),Player= sample(c("TRUE","FALSE"),35,TRUE)) 
df1$playing <- sapply(df1$Player, function(x) ifelse(x==TRUE,1,0)) 
df1 <- df1[,-2] 

spread(df1, ID, playing) 

並推廣到多個遊戲(即每個玩家ID多行)

df1 <- data.frame(ID = rep(1:35,each=3),GameID=rep(1:3,35),Player= sample(c("TRUE","FALSE"),105,TRUE)) 
df1$playing <- sapply(df1$Player, function(x) ifelse(x==TRUE,1,0)) 
df1 <- df1[,-3] 

spread(df1, ID, playing) 

樣本輸出

GameID 1 2 3 4 
     1 0 1 0 0 
     2 0 0 1 0 
     3 0 1 0 0 
+0

我正在尋找一種比ac(「TRUE」,「TRUE」,「FALSE」)方法更普遍的方法,因爲我有35行,而且我需要多次運行這些數據。 – SoccerAnalytics26

+0

@ SoccerAnalytics26你能解釋更多嗎?我只是選擇「TRUE」「TRUE」「FALSE」來近似我假設你的x $ player列的樣子。這段代碼對於任何TRUE/FALSE向量都可以正常工作 – Mako212

+0

@ SoccerAnalytics26我剛剛改變了我建立'df1'的方式,使之更清晰 – Mako212

1

在這種情況下,您不需要paste0。對於我所瞭解的您的嘗試代碼,類似以下內容可能會完成這項工作。

首先讓我們組成數據幀xy

set.seed(1) # make it reproducible 
x <- data.frame(A = 1:5, B = rnorm(5)) 
y <- data.frame(Playing = sample(c("True","False"), 10, TRUE)) 

現在,創建新列。

for(player in names(x)) { 
    y[[player]] <- ifelse(y$Playing == "True", 1, 0) 
} 

列已創建。

str(y) 
'data.frame': 10 obs. of 3 variables: 
$ Playing: Factor w/ 2 levels "False","True": 2 2 1 2 1 2 1 1 2 1 
$ A  : num 1 1 0 1 0 1 0 0 1 0 
$ B  : num 1 1 0 1 0 1 0 0 1 0 
+0

我認爲這非常接近。你知道我怎麼能爲我的桌子上的每個球員創建一個新的列,因爲每個球員將有不同的0和1(用於播放時間)。 – SoccerAnalytics26

+0

@ SoccerAnalytics26上面的代碼確實爲'x'的每一列創建了一個新列。我將編輯我的代碼以使其更清楚。 –