我使用R来处理人口普查数据,该数据使用非常长的数字GEOID来识别地理位置.我面临的问题是,当使用write_csv
(从readr
包中)写出处理过的数据时,它正在用科学记数法编写这些GEOID.有办法解决这个问题吗?
注意:我可以通过将scipen
选项设置为足够大的值来切换R控制台上的科学记数法显示.但是这个设置似乎没有扩展到readr
库中.
这是一个玩具数据集:
library(dplyr)
library(readr) # which is the package with write_csv
(tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1))))
Source: local data frame [6 x 1]
GEOID
1 60150001022000
2 60150001022001
3 60150001022002
4 60150001022003
5 60150001022004
6 60150001022005
write_csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv")
Run Code Online (Sandbox Code Playgroud)
这就是我目前所获得的.我正在寻找一种方法来获得与上面相同的数字:
GEOID
6.02E+13
6.02E+13
6.02E+13
6.02E+13
6.02E+13
6.02E+13
Run Code Online (Sandbox Code Playgroud) 我有一个pandas.DataFrame
看起来像这样的.
COL1 COL2 COL3
C1 None None
C1 C2 None
C1 C1 None
C1 C2 C3
Run Code Online (Sandbox Code Playgroud)
对于此数据帧中的每一行,我想计算每个C1,C2,C3的出现次数,并将此信息作为列附加到此数据帧.例如,第一行具有1个C1,0个C2和0个C3.最终的数据框应如下所示
COL1 COL2 COL3 C1 C2 C3
C1 None None 1 0 0
C1 C2 None 1 1 0
C1 C1 None 2 0 0
C1 C2 C3 1 1 1
Run Code Online (Sandbox Code Playgroud)
因此,我创建了一个以C1,C2和C3作为值的系列 - 一种最重要的方法是循环遍历DataFrame的行和列,然后通过此系列,并在计数器匹配时递增计数器.但有没有一种apply
方法能够以紧凑的方式实现这一目标?
我有一个pandas Series
对象,每个值都是a DataFrame
.我正在尝试将此转换为单个,DataFrame
其中所有Series
值(个体DataFrame
)堆叠在彼此之上.如何在没有循环的情况下实现这一目标?
下面的玩具示例生成测试对象(results
).
import pandas as pd
import numpy as np
numrows = 10000
def toy_function(x):
silly_sequence = np.random.uniform(10, 100, (x+1))
toy = pd.DataFrame({'ID':pd.Series(np.random.random_integers(1,20,3)),'VALUE':pd.Series((np.median(silly_sequence),np.mean(silly_sequence), np.max(silly_sequence)))})
return toy
results = pd.DataFrame({'ID':range(numrows)})['ID'].apply(toy_function)
Run Code Online (Sandbox Code Playgroud)
results
是Series
类型,每个元素是DataFrame
这样的:
In [1]: results[1]
Out[1]:
ID VALUE
0 17 40.035398
1 8 40.035398
2 20 66.483083
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种堆叠等方式results[1]
,results[2]
以产生这样的DataFrame:
ID VALUE
0 17 40.035398
1 8 40.035398
2 20 66.483083
4 12 …
Run Code Online (Sandbox Code Playgroud) 我有一个R数据帧,我需要从中分配数据.子集将基于数据帧中的两列.例如:
A <- c(1,2,3,3,5,1)
B <- c(6,7,8,9,8,8)
Value <- c(9,5,2,1,2,2)
DATA <- data.frame(A,B,Value)
Run Code Online (Sandbox Code Playgroud)
这就是DATA的样子
A B Value
1 6 9
2 7 5
3 8 2
3 9 1
5 8 2
1 8 2
Run Code Online (Sandbox Code Playgroud)
我想要那些(A,B)组合是(1,6)和(3,8)的数据行.这些对存储为A和B的单个(有序)向量:
AList <- c(1,3)
BList <- c(6,8)
Run Code Online (Sandbox Code Playgroud)
现在,我想通过比较基本子集数据如果某列存在于ALIST 和 -B柱上在BList存在
DATA[(DATA$A %in% AList & DATA$B %in% BList),]
Run Code Online (Sandbox Code Playgroud)
子集化结果如下所示.除了价值对(1,6)和(3,8),我也得到(1,8).基本上,这个过滤器给了我AList和BList中所有组合的值对.如何将其限制为(1,6)和(3,8)?
A B Value
1 6 9
3 8 2
1 8 2
Run Code Online (Sandbox Code Playgroud)
这是我想要的结果:
A B Value
1 6 9
3 8 2
Run Code Online (Sandbox Code Playgroud) 我试图生成一个tbl_df
0或1的随机整数列.这是我正在使用的代码:
library(dplyr)
set.seed(0)
#Dummy data.frame to test
df <- tbl_df(data.frame(x = rep(1:3, each = 4)))
#Generate the random integer column
df_test = df %>%
mutate(pop=sample(0:1, 1, replace=TRUE))
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有像我预期的那样发挥作用.我生成的字段似乎都是零.这是因为内部语句mutate
是并行评估的,因此最终使用相同的种子进行第一次随机抽取?
df_test
Source: local data frame [12 x 2]
x pop
1 1 0
2 1 0
3 1 0
4 1 0
5 2 0
6 2 0
7 2 0
8 2 0
9 3 0
10 3 0
11 3 0
12 3 0
Run Code Online (Sandbox Code Playgroud)
在过去的几个小时里,我正在打破这个局面.知道我的脚本中有什么缺陷吗?
我正在压缩数据库 ( SQLite
),并且正在尝试优化在架构中分配的数据类型的大小。我拥有的数据大致可分为 3 类数字。他们是:
101010000
- 9 位数字0
或1
, - 只有 1 或 013.4567
- 浮动类型。我只想在这里存储 13.45。所有数字都将用于程序内的数学运算。我使用这个网站作为参考: http: //www.sqlite.org/datatype3.html
我想知道哪种数据类型亲和力将为我提供最紧凑的数据库。我目前得到的数据库大小接近 40 GB!
谢谢您的帮助。
R功能是什么numpy
或pandas
相当于什么sweep()
?
详细说明:在R中假设我们有一个系数向量(比如beta - 数字类型)和一个数组(比如数据--20x5数字类型).我想在数组的每一行上叠加向量并乘以相应的元素.然后返回结果(20x5)数组我可以实现这个sweep()
.在下面找到示例R
代码.
beta <- c(10, 20, 30, 40)
data <- array(1:20,c(5,4))
sweep(data,MARGIN=2,beta,`*`)
#---------------
> data
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> beta
[1] 10 20 30 40
> sweep(data,MARGIN=2,beta,`*`)
[,1] [,2] [,3] [,4]
[1,] 10 120 330 640
[2,] 20 140 360 680
[3,] …
Run Code Online (Sandbox Code Playgroud) 我有一个程序的原始文本输出,我想转换成一个DataFrame
.文本文件未格式化,如下所示.
10037 149439Special Event 11538.00 13542.59 2004.59
10070 10071Weekday 8234.00 9244.87 1010.87
10216 13463Weekend 145.00 0 -145.00
Run Code Online (Sandbox Code Playgroud)
我能够将数据读入R
使用readLines()
的基本包.如何将其转换为看起来像这样的数据(列名可以是任何东西).
A B C D E F
10037 149439 Special Event 11538.00 13542.59 2004.59
10070 10071 Weekday 8234.00 9244.87 1010.87
10216 13463 Weekend 145.00 0 -145.00
Run Code Online (Sandbox Code Playgroud)
我应该使用什么正则表达式来实现这一目标?我知道,这是理想的应用组合regexec()
和regmatches()
.但是我无法想出一个将行分成所需组件的表达式.
如何data.table
使用矩阵中的值更新多个列.这是一个说明我面临的问题的MWE:
library(data.table)
DT = data.table(expand.grid(1:3,1:3,1:3))
DF = expand.grid(1:3,1:3,1:3)
mat = matrix(seq(0, 80), 27, 3)
Run Code Online (Sandbox Code Playgroud)
在这个data.frame
世界里,我会使用这种语法:
DF[,2:ncol(DF)] = mat[,2:ncol(DF)] #Data frame approach
Run Code Online (Sandbox Code Playgroud)
类似的data.table
语法产生了多个警告,输出非常奇怪.
DT[,2:ncol(DF) := mat[,2:ncol(DF)], with=FALSE] #Data table approach
Run Code Online (Sandbox Code Playgroud)
这显然是错误的 - 因为警告表明矩阵实际上是扁平的.警告信息:
1: In `[.data.table`(DT, , `:=`(2:ncol(DF), mat[, 2:ncol(DF)]), with = FALSE) :
2 column matrix RHS of := will be treated as one vector
Run Code Online (Sandbox Code Playgroud) 我的目标是比较各种社会经济因素(如多年收入)的分布情况,以了解人口在特定地区的演变情况,例如5年多.这方面的主要数据来自Public Use Microdata Sample.我使用R
+ ggplot2
作为我的首选工具.
在比较两年的数据(2005年和2010年)时,我有两个数据框hh2005
和两年hh2010
的家庭数据.两年的收入数据存储hincp
在两个数据框的变量中.使用ggplot2
我将创建个别年份的密度图如下(2010年的例子):
p1 <- ggplot(data = hh2010, aes(x=hincp))+
geom_density()+
labs(title = "Distribution of income for 2010")+
labs(y="Density")+
labs(x="Household Income")
p1
Run Code Online (Sandbox Code Playgroud)
如何在此图上叠加2005年的密度?我无法弄清楚data
因为hh2010
我不知道如何继续阅读.我应该从一开始就以一种根本不同的方式处理数据吗?