2017-02-20 61 views
0

不确定如何弄清楚这一点。将因子变量相对于另一行移动一行

下面是一个简单的数据集:

Bob <- sample("Bob", 6, replace = T) 
Jeff <- sample("Jeff", 6, replace = T) 
Carl <- sample("Carl", 6, replace = T) 
Name <- array(c(Bob, Jeff, Carl), dim = c(18,1)) 
Week <- c("Week 1", "Week 2", "Week 3", "Week 4", "Week 5", "Week 6", 
     "Week 1", "Week 2", "Week 3", "Week 4", "Week 5", "Week 6", 
     "Week 1", "Week 2", "Week 3", "Week 4", "Week 5", "Week 6") 

variable.1 <- c("No", "No", "No", "Yes", "No", "No", 
      "Yes", "No", "No", "No", "Yes", "No", 
      "No", "Yes", "No", "No", "No", "Yes") 

df <- data.frame(Name, Week, variable.1) 
df 

    Name Week variable.1 
1 Bob Week 1   No 
2 Bob Week 2   No 
3 Bob Week 3   No 
4 Bob Week 4  Yes 
5 Bob Week 5   No 
6 Bob Week 6   No 
7 Jeff Week 1  Yes 
8 Jeff Week 2   No 
9 Jeff Week 3   No 
10 Jeff Week 4   No 
11 Jeff Week 5  Yes 
12 Jeff Week 6   No 
13 Carl Week 1   No 
14 Carl Week 2  Yes 
15 Carl Week 3   No 
16 Carl Week 4   No 
17 Carl Week 5   No 
18 Carl Week 6  Yes 

我所试图做的是移动任何在variable.1列了一排“是”,以便它可以反映为一个因子变量在一周前的信息。我试图由个人来完成(而不是整个数据集)。当两个变量都是因素时,我无法弄清楚解决这个问题的最佳方法。理想情况下,我想要出现一个NA。我不想让所有的东西都简单地向上移动。我只想让一个NA出现在“是”的地方,并让它覆盖它上面的“否”。

所以,我非常喜欢的成品厕所像“New.Col”下面:

Name Week variable.1 New.Col 
1 Bob Week 1   No  No 
2 Bob Week 2   No  No 
3 Bob Week 3   No  Yes 
4 Bob Week 4  Yes  NA 
5 Bob Week 5   No  No 
6 Bob Week 6   No  No 
7 Jeff Week 1  Yes  NA 
8 Jeff Week 2   No  No 
9 Jeff Week 3   No  No 
10 Jeff Week 4   No  Yes 
11 Jeff Week 5  Yes  NA 
12 Jeff Week 6   No  No 
13 Carl Week 1   No  Yes 
14 Carl Week 2  Yes  NA 
15 Carl Week 3   No  No 
16 Carl Week 4   No  No 
17 Carl Week 5   No  Yes 
18 Carl Week 6  Yes  NA 
+0

什么你想要发生像(杰夫,第1周,是)的情况吗? –

+0

啊,好问题。抱歉不说。将更新我的文章。理想情况下,我想要出现一个NA。我不想让所有的东西都简单地向上移动。我只想让一个NA出现在“是”的地方,并让它覆盖它上面的“否”。 – user3585829

+1

我还是有点困惑。你可以给你想要这个例子的新列是什么吗? –

回答

1

让我们试试这个。

我打算按名称和周期排列df,以防万一某些数据出错。 (这不包括任何失踪的周!)我还会在newcol中扮演variable.1的角色。

df <- df[order(df$Name, df$Week),] 
df$newcol <- as.character(df$variable.1) 

为了便于理解,我会写一个循环,但是计算,有更好的方法来做到这一点。这个循环将着眼于每一个独特的人DF $名称

for (person in unique(df$Name)) { 

} 

在循环中,我要选择的每个人在newcol所有条目。

oldvalues <- df[df$Name == person, ]$newcol 

然后,我会继续前进,并将每个值向上移动1个条目,并使最后一个条目NA。

newvalues <- c(oldvalues[2:length(oldvalues)], NA) 

我还想通过使每周的NA值为“是”来解释每次旧值。

newvalues[oldvalues == "Yes"] <- NA 

然后我可以把它放回df

df[df$Name == person,]$newcol <- newvalues 

现在循环结束后,就可以使df$newcol回因素,无论是排除NA的水平默认

df$newcol <- factor(df$newcol) 

或使其成为第三个因素水平

df$newcol <- factor(df$newcol, exclude = NULL) 
+0

谢谢。这似乎并不奏效。如果我在for循环中运行这些东西,我会在'[.data.frame'(df,df $ Name == person,df $ newcol)中得到这个错误:错误:undefined columns selected – user3585829

+0

我很抱歉。我有两个我修好的拼写错误。 –

+0

非常好。比你多! – user3585829

相关问题