复杂的数据帧自引用

时间:2016-12-20 03:58:32

标签: r

我找不到回答这个问题的任何内容,所以如果重复,我会道歉。我也不确定如何说出来。

这是我为stackoverflow创建的示例 - 我的真实数据集要复杂得多:

Here is the example dataframe I am using

这背后的想法是这是一个工人的数据集。每个工作人员都有名为nameageState(他们所在的位置)和State_Lead的列中的信息,这是一个布尔列,表示他们是否是负责State的工人。

我的目标是双重的 - 我想要一个代码

1)引用StateState_Lead列,每State_Lead =TRUE需要1(非零,不是> 1)State。如果有多于或少于1,我想随机化每个State中的人变为State Lead

2)为每个State_Lead=TRUE调出当前State。理想情况下,我可以引用State并且能够从State_Lead的行调用任何内容(其中行的名称与Name列相同)。

#I made Jack not the state lead so the goal should be to return James and Jill
Database["Jack", "State_Lead"]=FALSE

All_States <- unique(Database$State)
All_States


##Here I thought I could cycle through each state and return the rows that                       matched each State Leader
heads <- NULL
for(i in All_States){
  heads <- append( heads, Database[, "State"==i])
  }

heads

## heads just returns "list()"

###attempt 2

heads <- NULL

for(i in All_States){
  if (sum(Database[Database[,"State"==i], "State_Lead"]) = 1)
    heads <-append(heads, Database[,"State"==i], "State_Lead"])
  else Database$State==i <- NA
    all_in_state <- subset(Database[, State="i"])
    sample(all_in_state, 1)

}

1 个答案:

答案 0 :(得分:2)

好吧,看起来你对整个编程肯定是全新的,而不仅仅是R.所以首先,我强烈建议你查看Coursera上的一些MOOC,例如this one。但是,至于你的问题,让我们看一下似乎引起混淆的每一部分。

首先,在本网站上寻求帮助时,最好提供实际数据,而不是数据集的图片。鉴于您已经在R中使用了一个数据框,您可以轻松利用dput函数,然后将其复制到您的问题中。因此,例如,您可能拥有以下数据框:

df = data.frame(name=c("John", "Jim", "Sally"), state=c("MI", "FL", "NY"), state_leader=c(TRUE, FALSE, TRUE))
df
   name state state_leader
1  John    MI         TRUE
2   Jim    FL        FALSE
3 Sally    NY         TRUE

然后我们可以使用dput(df)并获得以下输出:

dput(df)
structure(list(name = structure(c(2L, 1L, 3L), .Label = c("Jim", 
"John", "Sally"), class = "factor"), state = structure(c(2L, 
1L, 3L), .Label = c("FL", "MI", "NY"), class = "factor"), state_leader = c(TRUE, 
FALSE, TRUE)), .Names = c("name", "state", "state_leader"), row.names = c(NA, 
-3L), class = "data.frame")

我们这些Stack Overflow现在可以从dput复制输出并拥有数据集的工作副本。

接下来,让我们看看您对如何在数据集中设置新值的困惑。在您的更新文本中,您尝试使用以下代码state_leaderFALSE设置为df["John", "state_leader"] = FALSE。这有两个原因:1)&#34; John&#34;并不指向任何事情。当你只是说&#34; John&#34;时,R不知道你的意思。 2)即使假设索引逻辑的第一部分是正确的,只需简单地输入&#34; state_leader&#34;在索引的第二部分中,您告诉R您希望整个列等于FALSE。做你想做的事的正确方法是使用以下内容。

df[df$name == "John", "state_leader"] = FALSE

这样,R知道你希望变量name等于&#34; John&#34;。

所以,现在我们已经拥有了它,现在可能是查看[运算符并理解其工作原理的好时机。因为您在理解索引的工作原理时,尝试查找值的复杂算法并不像您想象的那么复杂。

如果R中有一维对象,例如向量,[将获取一个参数。如果您有二维对象,例如数据框或矩阵,[将获取两个参数,其中一个参数是可选的。让我们看一些例子。

x = 1:10 # A one-dimensional vector
x[1:3] # Get the first three elements of x
x[c(1, 3, 5, 7, 9)] # Get all odd elements of x
x[x %% 2 != 0] # Get all odd elements of x

在上面的例子中,我们正在使用一维向量。我们执行的三个操作突出显示了关于[的几个关键点。第一个关键点是[期望数字输入,或者可以转换为数字输入的东西。其次,数字输入不必是连续的。最后,数字输入可以是返回数字结果的函数,例如x %% 2 != 0。最后一个例子非常适合用于演示我的意思,可以转换为数字输入&#34;。您可以通过以下方式考虑这一点:首先,R计算x %% 2。然后检查每个元素以查看它是否等于0,这将返回一个布尔值等于TRUEFALSE的向量。然后它检查哪些值是TRUE并返回索引的矢量等于c(1, 3, 5, 7, 9),这与我们的第二个例子相同。

现在,让我们看看df,了解[如何处理二维对象。使用2D对象时,[的第一个参数会告诉您需要哪些,第二个参数会告诉您需要哪些

df[df$name == "John", ] # Get all rows where name equals "John" and ALL columns
df[, c(1, 3)] # Get all rows and only the first and third column
df[grepl("^J", df$name), 3] # Get all rows with names that start with "J" and only the third column

正如我们在前两个示例中所见,您不需要为[中的每个参数提供值。如果将其中一个值留空,则默认为从对象返回所有可用的行或列。您还会注意到,即使我们正在指定行,例如df[df$name == "John", ],我们也会专门调用列名称。这是因为我们需要R来理解我们要检查哪一列以确定我们是否保留该行。最后,您还应该注意到,我们之前对一维对象中[的所有理解都存在于此。它需要一个数字输入,或一个可以转换为数字输入的输入。因此,在第一个示例中,df$name == "John"将生成值为c(TRUE, FALSE, FALSE)的布尔向量,然后R将检查哪些值为TRUE并返回值1,表示只有第一行符合该条件。

现在,我们了解了[的工作原理,让我们看看如何使用它来解决我们的问题。我们知道我们需要所有列,因此我们可以忽略[中的第二个参数。我们知道我们只想要state_leaderTRUE的行。因此,让我们在索引中使用该条件。

df[df$state_leader == TRUE, ]
   name state state_leader
1  John    MI         TRUE
3 Sally    NY         TRUE

作为一项练习,您只需返回namestate变量,如何才能更好地提高输出效果?