我有以下数据框:
library(dplyr)
library(tibble)
df <- tibble(
source = c("a", "b", "c", "d", "e"),
score = c(10, 5, NA, 3, NA ) )
df
Run Code Online (Sandbox Code Playgroud)
它看起来像这样:
# A tibble: 5 x 2
source score
<chr> <dbl>
1 a 10 . # current max value
2 b 5
3 c NA
4 d 3
5 e NA
Run Code Online (Sandbox Code Playgroud)
我想要做的是NA
用现有的值范围替换分数列max + n
。其中n
范围从 1 到总行数df
导致这个(手工编码):
source score
a 10
b 5
c 11 # obtained from 10 + …
Run Code Online (Sandbox Code Playgroud) 我可以直接在n列中删除列表列吗?
可以假定该列表是规则的,所有元素的长度相等.
如果不是列表列,我会有一个字符向量,我可以tidyr::separate
.我可以tidyr::unnest
,但我们需要另一个辅助变量才能tidyr::spread
.我错过了一个明显的方法吗?
示例数据:
library(tibble)
df1 <- data_frame(
gr = c('a', 'b', 'c'),
values = list(1:2, 3:4, 5:6)
)
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)# A tibble: 3 x 2 gr values <chr> <list> 1 a <int [2]> 2 b <int [2]> 3 c <int [2]>
目标:
df2 <- data_frame(
gr = c('a', 'b', 'c'),
V1 = c(1, 3, 5),
V2 = c(2, 4, 6)
)
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)# A tibble: 3 x 3 gr V1 V2 <chr> <dbl> …
在 R 中,某些函数仅适用于 a data.frame
,而其他函数仅适用于 atibble
或 a matrix
。
使用as.data.frame
或转换我的数据as.matrix
通常可以解决这个问题,但我想知道这三者有何不同?
我记得读书的地方,as.tibble()
是一个别名的as_data_frame()
,但我不知道到底是什么的别名是在编程术语.它与包装器类似吗?
所以我想我的问题大概可以归结为在两者之间可能的用法区别tbl_df()
和as_data_frame()
:什么是它们之间的区别,如果有的话?
更具体地说,给定(非tibble)数据帧df
,我经常使用以下方法将其转换为tibble:
df <- tbl_df(df)
Run Code Online (Sandbox Code Playgroud)
岂不
df <- as_data_frame(df)
Run Code Online (Sandbox Code Playgroud)
做同样的事?如果是这样,是否存在其他两种功能tbl_df()
并且as_data_frame()
不能互换使用以获得相同结果的情况?
在R文件说,
tbl_df()
将论证转发给as_data_frame()
这是否意味着它tbl_df()
是一个包装或别名as_data_frame()
?R文档似乎没有说什么as.tibble()
,我忘记了我读到它的别名as_data_frame()
.此外,显然 as_tibble()
是另一个别名as_data_frame()
.
如果这四个函数的功能完全相同,那么赋予一个函数四个不同名称的意义何在?这不是更有说服力而不是有用吗?
考虑这个简单的例子
import pandas as pd
mydata = pd.DataFrame({'mytime': [pd.to_datetime('2018-01-01 10:00:00.513'),
pd.to_datetime('2018-01-03 10:00:00.513')],
'myvariable': [1,2],
'mystring': ['hello', 'world']})
mydata
Out[7]:
mystring mytime myvariable
0 hello 2018-01-01 10:00:00.513 1
1 world 2018-01-03 10:00:00.513 2
Run Code Online (Sandbox Code Playgroud)
我知道我可以msgpack
使用Pandas
以下方式写入该数据框:
mydata.to_msgpack('C://Users/john/Documents/mypack')
Run Code Online (Sandbox Code Playgroud)
问题是:如何读取该msgpack
文件R
?
using RcppMsgPack
返回一些令人困惑的输出,不是dataframe
/tibble
library(tidyverse)
library(RcppMsgPack)
df <- msgpack_read('C://Users/john/Documents/mypack', simplify = TRUE)
> df
$axes
$axes[[1]]
$axes[[1]]$typ
[1] "index"
$axes[[1]]$name
NULL
$axes[[1]]$klass
[1] "Index"
$axes[[1]]$compress
NULL
$axes[[1]]$data
[1] "mystring" "mytime" "myvariable"
$axes[[1]]$dtype
[1] "object"
$axes[[2]] …
Run Code Online (Sandbox Code Playgroud) 从版本1.4.1开始,tibble
print方法似乎正在使用pillar
包实现的其他格式(https://rdrr.io/cran/tibble/f/NEWS.md).后者尝试输出尽可能多的列,缩短一些值.是否可以禁用此格式并返回之前存在的打印方法?在某些情况下,通过输出额外的列并缩短值,柱子使得难以读取第一列的内容,这通常是分析师的意图.
很难提供可重复的示例,因为输出和格式化将取决于您的特定显示的具体情况.我希望这个问题很简单:如何禁用tibble打印的支柱格式化(例如在控制台中).
编辑:在tibble github存储库上提出了同样的问题:https://github.com/tidyverse/tibble/issues/361#issuecomment-357233716.似乎目前无法禁用格式化.可以提供一些选项,包的开发版本(在撰写本文时)确实可以更好地进行格式化.但是,它仍然不完美,可能会截断重要信息(另请参阅github讨论涉及的问题).因此,禁用格式仍然是某些用户可能想要实现的.
有些tidyverse
函数返回数据帧,但有些函数返回小标题。我找不到关于哪些函数返回哪种数据类型的任何资源,也看不到任何真正可预测的模式。以下是一些示例以供说明:
library(tidyverse)
# Returns dataframe
df1 <- iris %>% mutate(newcol = mean(Sepal.Length))
df2 <- iris %>% filter(Sepal.Length > 5)
df3 <- iris %>% select(Sepal.Length, Species)
class(df1); class(df2); class(df3)
[1] "data.frame"
[1] "data.frame"
[1] "data.frame"
# Returns tibble
df4 <- iris %>% add_count(Species)
df5 <- iris %>% pivot_longer(cols = -Species)
df6 <- iris %>% group_by(Species) %>% mutate(newcol = mean(Sepal.Length))
class(df4); class(df5); class(df6)
[1] "tbl_df" "tbl" "data.frame"
[1] "tbl_df" "tbl" "data.frame"
[1] "grouped_df" "tbl_df" "tbl" "data.frame"
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉函数的返回值类型是什么?或者,在 tidyverse 中有哪些函数返回哪种数据类型的资源?许多 R …
我有一个玩具的例子.对由x组成的两个连续y行进行求和的最有效方法是什么
library(tibble)
l = list(x = c("a", "b", "a", "b", "a", "b"), y = c(1, 4, 3, 3, 7, 0))
df <- as_tibble(l)
df
#> # A tibble: 6 x 2
#> x y
#> <chr> <dbl>
#> 1 a 1
#> 2 b 4
#> 3 a 3
#> 4 b 3
#> 5 a 7
#> 6 b 0
Run Code Online (Sandbox Code Playgroud)
所以输出就是这样的
group sum seq
a 4 1
a 10 2
b 7 1
b 3 2
Run Code Online (Sandbox Code Playgroud)
我想使用RcppRoll包中的tidyverse和可能的roll_sum()并使用代码,以便可变长度的连续行可以用于真实世界数据,其中会有很多组
TIA
我有一个名为的列名称向量tbl_colnames
。
我想用0行和length(tbl_colnames)
列创建小标题。
我发现这样做的最好方法是...
tbl <- as_tibble(data.frame(matrix(nrow=0,ncol=length(tbl_colnames)))
然后我想命名这些列,以便...
colnames(tbl) <- tbl_colnames
。
我的问题:是否有更优雅的方法?
就像是 tbl <- tibble(colnames=tbl_colnames)
我有一个像这样导入的 Excel 工作表中的数据:
F4_Off <- readxl::read_xlsx("myExcel.xlsx", sheet = "Offline", col_names = TRUE, range = "I1:L285")
F4_Off
F4_On <- readxl::read_xlsx("myExcel.xlsx", sheet = "Online", col_names = TRUE, range = "J1:M68")
F4_On
Run Code Online (Sandbox Code Playgroud)
这是结合使用:
F4_Gesamt <- rbind(F4_Off, F4_On)
Run Code Online (Sandbox Code Playgroud)
数据如下所示:
A tibble: 351 x 4
nein Smartphone `Computer / Laptop / Tablet` `keine Angabe`
<dbl> <dbl> <dbl> <dbl>
1 NA NA 1. NA
2 NA 1. NA NA
3 NA 1. NA NA
4 NA 1. NA NA
5 NA 1. 1. NA
6 NA …
Run Code Online (Sandbox Code Playgroud)