【问题标题】:Moving a factor variable up one row relative to another将因子变量相对于另一行向上移动
【发布时间】:2017-02-22 00:32:03
【问题描述】:

不确定如何解决这个问题。

这是一个示例数据集:

 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

【问题讨论】:

  • 对于(Jeff,第 1 周,是)这样的情况,您希望发生什么?
  • 啊,好问题。抱歉没说。会更新我的帖子。理想情况下,我希望出现一个 NA。我不希望一切都简单地向上移动。我只希望 NA 出现在“是”所在的位置,并让它覆盖上面的“否”。
  • 我还是有点困惑。您能否给出您希望此示例的新列是什么?
  • 对不起,我很难解释清楚。我在我的原始帖子中放了一个示例,说明我希望它是什么样子。
  • 没关系。现在我们都对这个问题有了更好的了解,回答起来就更容易了

标签: r data-cleaning


【解决方案1】:

让我们试试这个。

我将继续按名称和周对df 进行排序,以防某些数据出现故障。 (这不会考虑到任何缺少的星期!)我还将复制variable.1 作为newcol 中的字符以供使用。

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

为了便于理解,我会写一个循环,但是计算,有更好的方法来做到这一点。此循环将查看 df$Name 中每个唯一的人

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)

【讨论】:

  • 谢谢。但这似乎不起作用。如果我在 for 循环中运行这些东西,我会得到这个错误:[.data.frame(df, df$Name == person, df$newcol) 中的错误:选择了未定义的列
  • 我很抱歉。我有两个错字已修正。
  • 优秀。比你好多了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
相关资源
最近更新 更多