我有以下示例输出:
country country-year year a b
1 France France2000 2000 NA NA
2 France France2001 2001 1000 1000
3 France France2002 2002 NA NA
4 France France2003 2003 1600 2200
5 France France2004 2004 NA NA
6 UK UK2000 2000 1000 1000
7 UK UK2001 2001 NA NA
8 UK UK2002 2002 1000 1000
9 UK UK2003 2003 NA NA
10 UK UK2004 2004 NA NA
11 Germany UK2000 2000 NA NA
12 Germany UK2001 2001 NA NA
13 Germany …Run Code Online (Sandbox Code Playgroud) 我不知道创建一个dplyr::mutate()带有单元素列表的新列表列实际上是深度复制元素以填充tibble长度(请参阅参考资料t3).这是为什么?
如果我t4在创建tibble(t5)时指定了explicit()的正确长度或传递它,则元素将通过引用传递.
考虑以下情况,其中列表包含具有大向量的tibble.
library(tidyverse)
library(pryr)
t1 <- tibble(a = 1:4)
t2 <- tibble(b = 1:1e6)
t3 <- mutate(t1, tl = list(t2))
t4 <- mutate(t1, tl = rep(list(t2), n()))
t5 <- tibble(a = 1:4, tl = list(t2))
object_size(t2)
#> 4 MB
object_size(t3)
#> 16 MB
object_size(t4)
#> 4 MB
object_size(t5)
#> 4 MB
Run Code Online (Sandbox Code Playgroud)
由reprex包创建于2019-02-22 (v0.2.1)
我正在寻找一种方法,在 id 和组中,使用 100 的滞后(或领先) value和新索引号idx_value来计算下一个索引号。
# install.packages(c("tidyverse"), dependencies = TRUE)
library(tibble)
library(magrittr)
Run Code Online (Sandbox Code Playgroud)
就像,我有这个数据框:
start_tbl <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L), grp = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L,
1L, 1L, 2L, 2L, 2L), year = c(7L, 8L, 9L, 10L, 7L, 8L, 9L, 10L,
7L, 8L, 9L, 7L, 8L, 9L), value = c(2, -7, -2.3, 1.1, -1, -12,
-4, 2, 1, -3, 2, …Run Code Online (Sandbox Code Playgroud) 在阅读并重新阅读了许多"使用dplyr编程"指南之后,我仍然无法找到解决我的特定情况的方法.
据我所知,使用group_by_,mutate_和tidyverse功能,例如"字符串型"版本向弃用的标题,这enquo是要走的路.
然而,我的情况有所不同,我正在努力寻找一种整洁的方式来解决它的整洁方式.
实际上,我的目标是在函数内创建和操作数据帧.基于其他人创建(变异)新变量,使用它们等.
但是,无论我怎么努力,我的代码都会出错或者在包检查时返回一些警告,例如no visible binding for global variable ....
这是一个可重复的例子:
这就是我想要做的事情:
df <- data.frame(X=c("A", "B", "C", "D", "E"),
Y=c(1, 2, 3, 1, 1))
new_df <- df %>%
group_by(Y) %>%
summarise(N=n()) %>%
mutate(Y=factor(Y, levels=1:5)) %>%
complete(Y, fill=list(N = 0)) %>%
arrange(Y) %>%
rename(newY=Y) %>%
mutate(Y=as.integer(newY))
Run Code Online (Sandbox Code Playgroud)
一些常见的dplyr操作预期结果应该是:
# A tibble: 5 x 3
newY N Y
<fctr> <dbl> <int>
1 1 3 1
2 2 1 2
3 3 1 …Run Code Online (Sandbox Code Playgroud) 如何在 Tensorflow.js 中改变张量的值?例如,如果我有一个这样创建的张量:
const a = tf.tensor1d([1,2,3,4])
如何更改张量的第三个元素的值?我知道张量是不可变的,而变量是可变的。
这样做:const a = tf.variable(tf.tensor1d([1,2,3,4]))似乎并没有解决问题。我不能做:
const a = a[0].assign(5)
我可以像这样在python tensorflow 中做到这一点:
a = tf.Variable([1,2,3,4])
a = a[0].assign(100)
with tf.Session() as sess:
sess.run(tf.global_variables_iniliazer())
print sess.run(a)
这输出 [100, 2,3,4]
我有一个数据框,我需要按列条目的组合对其进行分组,以便仅使用 if 语句(没有 else 条件)有条件地改变几列。
更具体地说,如果某个组的列值超过预定义的阈值,我想对它们求和,否则这些值应保持不变。
我曾尝试使用这两种方法来执行此操作if_else,case_when但这些函数需要“假”参数 ( if_else) 或默认设置与 NA ( case_when)不匹配的值:
iris_mutated <- iris %>%
dplyr::group_by(Species) %>%
dplyr::mutate(Sepal.Length=if_else(sum(Sepal.Length)>250, sum(Sepal.Length)),
Sepal.Width=if_else(sum(Sepal.Width)>170, sum(Sepal.Width)),
Petal.Length=if_else(sum(Petal.Length)>70, sum(Petal.Length)),
Petal.Width=if_else(sum(Petal.Width)>15, sum(Petal.Width)))
iris_mutated <- iris %>%
dplyr::group_by(Species) %>%
dplyr::mutate(Sepal.Length=case_when(sum(Sepal.Length)>250 ~ sum(Sepal.Length)),
Sepal.Width=case_when(sum(Sepal.Width)>170 ~ sum(Sepal.Width)),
Petal.Length=case_when(sum(Petal.Length)>70 ~ sum(Petal.Length)),
Petal.Width=case_when(sum(Petal.Width)>15 ~ sum(Petal.Width)))
Run Code Online (Sandbox Code Playgroud)
任何想法如何做到这一点?
编辑:
这是预期输出的示例。所有物种分组条目的花瓣宽度总和为setosa为 12.3 ,virginica为101.3 ,versicolor为66.3 。如果我要求这个总和应该至少为 15 来求和的值(否则应该保留原始值),那么我期望以下输出(仅显示列“Petal.Width”和“Species”):
Petal.Width Species
1 0.2 setosa
2 0.2 setosa
3 0.2 setosa
4 0.2 setosa …Run Code Online (Sandbox Code Playgroud) 我有一些看起来像这样的数据:
Year Revenue Cost Rent
1 2016 3000 4 100
2 2017 4000 5 100
3 2018 5000 6 100
df <- data.frame(stringsAsFactors=FALSE,
Year = c(2016L, 2017L, 2018L),
Revenue = c(3000L, 4000L, 5000L),
Cost = c(4L, 5L, 6L),
Rent = c(100L, 100L, 100L)
)
Run Code Online (Sandbox Code Playgroud)
我想将所有内容分成以下百分比Rent:
library(dplyr)
df <- df %>% mutate_at(vars(Revenue:Rent), funs(. /Rent))
Run Code Online (Sandbox Code Playgroud)
这完美地工作。
Year Revenue Cost Rent
1 2016 30 0.04 1
2 2017 40 0.05 1
3 2018 50 0.06 1
Run Code Online (Sandbox Code Playgroud)
唯一的事情:我丢失了我原来的专栏。
我该如何做mutate_all, 以便我有新的列,比如说叫做 …
我在不同的位置和时间对鸟类进行了一系列观察。数据框如下所示:
birdID site ts
1 A 2013-04-15 09:29
1 A 2013-04-19 01:22
1 A 2013-04-20 23:13
1 A 2013-04-22 00:03
1 B 2013-04-22 14:02
1 B 2013-04-22 17:02
1 C 2013-04-22 14:04
1 C 2013-04-22 15:18
1 C 2013-04-23 00:54
1 A 2013-04-23 01:20
1 A 2013-04-24 23:07
1 A 2013-04-30 23:47
1 B 2013-04-30 03:51
1 B 2013-04-30 04:26
2 C 2013-04-30 04:29
2 C 2013-04-30 18:49
2 A 2013-05-01 01:03
2 A 2013-05-01 23:15
2 A 2013-05-02 00:09 …Run Code Online (Sandbox Code Playgroud) 我在使用无法调试的 tidyverse 包时遇到了严重的问题。例如,即使在我已经制作的过去项目中,“mutate”也无法正常工作。当我安装以下软件包时,这一切都开始了:
library(pdftools)
library(tm)
library(stringi)
library(tidyverse)
Run Code Online (Sandbox Code Playgroud)
(或library(dplyr)
library(tidyr))
library(purrr))
当我执行rm(list=ls()).
我唯一没有尝试过的是卸载 R/RStudio 并重新安装它。我使用 RStudio 版本 1.0.153 和 R 版本 3.4.1。我实际上试图在其他计算机上重现该错误,但这显然不起作用。
这是一个临时示例:
library(tidyverse)
emp.data <- data.frame(emp_id=c(1:5),emp_name=c("Rick","Dan","Michelle","Ryan","Gary"),
salary=c(623.3,515.2,611.0,729.0,843.25),
start_date=as.Date(c("2012-01-01", "2013-09-23", "2014-11-15", "2014-05-11",
"2015-03-27"),
stringsAsFactors = FALSE)
)
emp.data_new <- emp.data %>%
mutate(RaisedSalary = salary*1.4)
Run Code Online (Sandbox Code Playgroud)
emp.data 在我的会话中定义正常。我希望在新数据框 emp.data.new ("RaisedSalary") 中添加一个新列,而不是这个,我得到:
mutate_impl(.data, dots) 中的错误:无法将对象转换为函数:[type=NULL; 目标=CLOSXP、SPECIALSXP 或 BUILTINSXP]。
如果我加载 tidyr/dplyr 而不是 tidyverse,我也会收到此错误消息。我在论坛上潜伏了 48 多个小时,但没有发现任何与此错误类似的东西。有没有人遇到过这样的错误?
sessionInfo() 的结果:
R version 3.4.1 (2017-06-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build …Run Code Online (Sandbox Code Playgroud) 我有一些随时间收集的变量。tibble 的一个非常简化的版本看起来像这样。
df = tribble(
~id, ~varA.t1, ~varA.t2, ~varB.t1, ~varB.t2,
'row_1', 5, 10, 2, 4,
'row_2', 20, 50, 4, 6
)
Run Code Online (Sandbox Code Playgroud)
我想系统地创建一组新的变量,varC以便varC.t#= varA.t#/ varB.t#where#是 1、2、3 等(类似于在上面的 tibble 中设置列名的方式)。
我如何使用类似mutate或 的东西across来做到这一点?