在r上使用循环来创建和填充新列

时间:2017-08-25 16:27:35

标签: r loops for-loop

我正在尝试编写一个循环,它将变量放在一个表(表x)的列中,并将这些名称用作另一个表(表y)中的列名,然后根据特定条件填充这些列。这是我的代码。我一直试图使用For循环。

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

我得到的错误是&#34;复杂分配中的无效功能&#34;

我正在处理体育数据。我的最终目标是计算每个球员在球场上的传球次数。我需要在球场上为球员分配变量1,如果他们在球场上则为0。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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