【问题标题】:Selecting rows with rowSums and mutate with dplyr error使用 rowSums 选择行并使用 dplyr 错误进行变异
【发布时间】:2018-07-17 04:37:43
【问题描述】:

数据:

head(well_being_df2)
# A tibble: 6 x 70
Age Gender  EmploymentStatus PWI1   PWI2   PWI3   PWI4   PWI5  PWI6 PWI7 Personality1 Personality2 Personality3  
<dbl> <dbl+l> <dbl+lbl>     <dbl+> <dbl+> <dbl+> <dbl+> <dbl> <dbl>  <dbl> <dbl+lbl>    <dbl+lbl>    

我正在选择列的子集并尝试改变它们。我玩过 使用here 提供的解决方案,但我遇到了各种错误。我正在尝试选择 PWI 列,然后使用 rowSums 变异为一个名为 PWI_Index 的新变量。

这行得通:

rowSums(select(well_being_df2, contains("PWI")))

[1] 50 32 48 32 58 52 41 51 49 37 50 53 58 47.... 
[38] 58 60 63 60 63 56 43 30 45 53 45 44 57 55.... 
[75] 50 55 57 58 57 58 58 58 62 62 44 59 58....

但是当我尝试变异时:

mutate(well_being_df2, x = rowSums(select(well_being_df2, 
contains("PWI"))))

哪个输出/选择整个列集而不是“PWI”列。示例:

# A tibble: 169 x 71
 Age Gender  EmploymentStatus PWI1   PWI2   PWI3   PWI4  PWI5  PWI6  PWI7  Personality1 Personality2 Personality3
 <dbl> <dbl+l> <dbl+lbl>        <dbl+> <dbl+> <dbl+> <dbl> <dbl> <dbl> <dbl> <dbl+lbl>    <dbl+lbl>    <dbl+lbl>   
 1  22   2       3                8      8      6      8     8     6    6     1            1            1    

 2  20   2       1                4      6      1      8     8     4     1     4            5            4           

它选择整个数据帧而不是“PWI”的选定行和。使用 [.4:10] 也不起作用。任何其他解决方案,我收到以下错误:

select(well_being_df2[.4:10]) %>%
mutate(PWI_Index = rowSums(.)) %>% left_join(well_being_df2)

Error: Column indexes must be integer, not 0.11, 1.11,...

加上之前的例子:

well_being_df2 %>%
 mutate(x = rowSums(select(., contains("PWI")))) %>%
 head()

它像以前一样占用整个列集。

【问题讨论】:

  • 你是什么意思,“它选择整个数据框”,这就是你告诉它要做的所有事情。您拥有的select 只是减少发送到rowSums 的列数,而不是返回。如果您还想减少返回的列,请将select 放在rowSums 之外。 (顺便说一句:要么使用与您之前的问题相同的数据,要么发布示例数据。另外,请"accept" 回答您之前的问题,否则您会发现有些人不太愿意提供帮助。)
  • @r2evans 接受了以前的答案。认为“赞成”意味着接受。
  • 请添加一个可重现的示例以及您的预期输出,以便其他人轻松帮助您。
  • *已编辑 - 希望能更好地解释我想要做什么。
  • 我试图将选定的新行打印到控制台,但我对 mutate 的理解已经偏离了……一英里。该解决方案确实像@maurits-Evers 概述的那样工作。

标签: r dplyr


【解决方案1】:

我不确定我是否理解(或能否重现)您的问题。

这是一个使用 iris 数据的示例,效果很好。

iris %>%
    mutate(x = rowSums(select(., contains("Width")))) %>%
    head()
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species   x
#1          5.1         3.5          1.4         0.2  setosa 3.7
#2          4.9         3.0          1.4         0.2  setosa 3.2
#3          4.7         3.2          1.3         0.2  setosa 3.4
#4          4.6         3.1          1.5         0.2  setosa 3.3
#5          5.0         3.6          1.4         0.2  setosa 3.8
#6          5.4         3.9          1.7         0.4  setosa 4.3

如您所见,x 是列Sepal.WidthPetal.Width 的总和,与

rowSums(select(iris, contains("Width"))) %>% head()
#[1] 3.7 3.2 3.4 3.3 3.8 4.3

【讨论】:

  • 这只会选择前 6 个条目,而不是所选列的整个观察集。
  • @psych.tek 这是因为我选择只显示带有head 的前六个条目以进行说明。删除该行以获取所有内容,即iris %&gt;% mutate(x = rowSums(select(., contains("Width"))))。详情见基本?head
  • 啊好的。忍受我,慢慢地了解事情。 :) 当我运行时:rowSums(select(well_being_df2, contains("PWI"))) 它的工作原理与您概述的完全一样。但是当我在 mutate mutate(well_being_df, x = rowSums(select(well_being_df2, contains("PWI")))) 中运行它时,它不会选择 PWI,而是选择整个行集。这就是我卡住的地方。
  • 好吧,事实证明我对 mutate 的理解有点不对劲。这确实有效,但它正在打印整组列包括新创建(变异)的列。
  • @psych.tek 是的,它添加了一个新列x,其中的条目基于从"PWI" 开始的列之间的行总和。你明白了;-)
猜你喜欢
  • 1970-01-01
  • 2018-08-24
  • 2018-03-10
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多