我无法重新排列以下数据框:
set.seed(45)
dat1 <- data.frame(
name = rep(c("firstName", "secondName"), each=4),
numbers = rep(1:4, 2),
value = rnorm(8)
)
dat1
name numbers value
1 firstName 1 0.3407997
2 firstName 2 -0.7033403
3 firstName 3 -0.3795377
4 firstName 4 -0.7460474
5 secondName 1 -0.8981073
6 secondName 2 -0.3347941
7 secondName 3 -0.5013782
8 secondName 4 -0.1745357
Run Code Online (Sandbox Code Playgroud)
我想重塑它,以便每个唯一的"名称"变量是一个rowname,其中"值"作为沿该行的观察值,"数字"作为同名.有点像:
name 1 2 3 4
1 firstName 0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
Run Code Online (Sandbox Code Playgroud)
我看melt,并cast和其他一些东西,但没有人可以做的工作.
我有这样庞大的数据帧:
SN = c(1:100, 1:100, 1:100, 1:100)
class = c(rep("A1", 100), rep("B2", 100), rep("C3", 100), rep("D4", 100)) # total 6000 levels
myvar = rnorm(400)
mydf = data.frame(SN, class, myvar)
Run Code Online (Sandbox Code Playgroud)
我希望"unmelt"到一个表,每个级别为单列,myvar填充:
SN A1 B2 C3 D4 .............and so on for all 6000
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点,我知道这是一个简单的问题,但我无法弄明白.
当由于非常大的数据计算将花费很长时间并且因此我们不希望它们崩溃时,事先知道要使用哪种重塑方法将很有价值。
最近,关于性能的数据重塑方法已得到进一步发展,例如data.table::dcast和tidyr::spread。尤其dcast.data.table似乎设置了基调[1],[2],[3],
[4]。这使得基准R中的其他方法reshape显得过时且几乎无用[5]。
但是,我听说对于reshape大型数据集(可能是超出RAM的数据集)来说,这仍然是无与伦比的,因为它是唯一可以处理它们的方法,因此它仍然存在。与reshape2::dcast此相关的崩溃报告支持这一点 [6]。至少有一个参考文献给出了一个暗示,它reshape()可能确实比reshape2::dcast真正的“大杂烩” [7]具有优势。
为此寻求证据,我认为值得花时间进行一些研究。所以我做了不同大小的模拟数据的基准,这日益耗尽RAM比较reshape,dcast,dcast.data.table,和spread。我查看了具有三列的简单数据集,具有不同数量的行以获得不同的大小(请参阅最底部的代码)。
> head(df1, 3)
id tms y
1 1 1970-01-01 01:00:01 0.7463622
2 2 1970-01-01 01:00:01 0.1417795
3 3 1970-01-01 01:00:01 0.6993089
Run Code Online (Sandbox Code Playgroud)
RAM大小仅为8 GB,这是我模拟“非常大”数据集的阈值。为了使计算时间合理,我对每种方法仅进行了3次测量,并专注于从长到宽的重塑。
unit: seconds
expr min lq mean median uq max neval size.gb …Run Code Online (Sandbox Code Playgroud) 因此,在生成一些假数据来回答地图问题的过程中,我发现自己写了以下内容:
# Generate some fake data
lat <- seq(-90, 90, by = 5)
lon <- seq(-180, 180, by = 10)
phi <- matrix(0, nrow = length(lat), ncol = length(lon))
i <- 1
for (l1 in lat) {
j <- 1
for (l2 in lon) {
phi[i, j] <- (sin(pi * l1 / 180) * cos(pi * l2 / 180))^2
j <- j+1
}
i <- i+1
}
phi <- 1500*phi + 4500 # scale it properly
Run Code Online (Sandbox Code Playgroud)
现在显然这两个中心for循环并不像我想的那样R'ish.看起来我应该能够得到一个mapply或者什么来做这项工作,但遗憾的是,它返回一个列表,并没有真正做我想要的.其他适用似乎也没有做正确的事情.
我在这里错过了什么?
希望这里有一个简单的答案,但我无法在任何地方找到它.
我有一个标有行和列的数字矩阵:
1 2 3 4
a 6 7 8 9
b 8 7 5 7
c 8 5 4 1
d 1 6 3 2
Run Code Online (Sandbox Code Playgroud)
我想要一个data.table(或我可以转换的data.frame)的形式:
col row value
1 a 6
1 b 8
1 c 8
1 d 1
2 a 7
2 b 7
2 c 5
2 d 6
...
Run Code Online (Sandbox Code Playgroud)
任何提示赞赏.
我有一个名为例如三个变量R A数据帧df$V1,df$V2,df$V3.
df$V1并且df$V2都是因素,而df$V3数字.
df <- data.frame(
V1 = letters[1:4],
V2 = rep(LETTERS[1:3], each = 4),
V3 = 1:12
)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方式来创建一个包含值的表df$V3,以df$V1作为行,df$V2作为列.
我尝试过桌子上的变化,但没有到达任何地方.也许有人可以提供帮助,先谢谢,戴维.
我在群集上运行一些R脚本时遇到问题.问题突然出现(所有脚本都工作正常,但有一天他们开始caught segfault出错).我无法提供可重现的代码,因为我甚至无法在我自己的计算机上重现错误 - 它只发生在群集上.我也使用相同的代码来处理两组数据 - 一个非常小而且运行正常,另一个使用更大的数据帧(大约1000万行)并在某些点崩溃.我只使用CRAN存储库中的包; R和所有包都应该是最新的.错误显示在完全不相关的操作上,请参阅以下示例:
会话信息:
R version 3.4.3 (2017-11-30)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Run Code Online (Sandbox Code Playgroud)
将变量写入NetCDF文件
# code snippet
library(ncdf4)
library(reshape2)
input <- read.csv("input_file.csv")
species <- "no2"
dimX <- ncdim_def(name="x", units = "m", vals = unique(input$x), unlim = FALSE)
dimY <- ncdim_def(name="y", units = "m", vals = unique(input$y), unlim = FALSE)
dimTime <- ncdim_def(name = "time", units = "hours", unlim = TRUE)
varOutput <- ncvar_def(name = species, units = "ug/m3",
dim = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用包中的daply函数,plyr但我无法正确输出.即使构成矩阵的变量是数字,矩阵的元素也是列表,而不是变量本身.这是一小部分数据,例如:
Month Vehicle Samples
1 Oct-10 31057 256
2 Oct-10 31059 316
3 Oct-10 31060 348
4 Nov-10 31057 267
5 Nov-10 31059 293
6 Nov-10 31060 250
7 Dec-10 31057 159
8 Dec-10 31059 268
9 Dec-10 31060 206
Run Code Online (Sandbox Code Playgroud)
我希望能够以矩阵格式可视化数据,这看起来像这样:
Month
Vehicle Oct-10 Nov-10 Dec-10
31057 256 267 159
31059 316 293 268
31060 348 250 206
Run Code Online (Sandbox Code Playgroud)
这里有一些我使用的替代语法(后者因为我的原始数据框有比我在这里显示的更多的列):
daply(DF, .(Vehicle, Month), identity)
daply(DF,.(Vehicle,Month), colwise(identity,.(Samples)))
Run Code Online (Sandbox Code Playgroud)
然而,我得到的是相当深奥的:
Month
Vehicle Oct-10 Nov-10 Dec-10
31057 List,3 List,3 List,3
31059 …Run Code Online (Sandbox Code Playgroud) 我想建立一个正方形邻接matrix从data.table.这是我已有的可重复的例子:
require(data.table)
require(plyr)
require(reshape2)
# Build a mock data.table
dt <- data.table(Source=as.character(rep(letters[1:3],2)),Target=as.character(rep(letters[4:2],2)))
dt
# Source Target
#1: a d
#2: b c
#3: c b
#4: a d
#5: b c
#6: c b
sry <- ddply(dt, .(Source,Target), summarize, Frequency=length(Source))
sry
# Source Target Frequency
#1 a d 2
#2 b c 2
#3 c b 2
mtx <- as.matrix(dcast(sry, Source ~ Target, value.var="Frequency", fill=0))
rownames(mtx) <- mtx[,1]
mtx <- mtx[,2:ncol(mtx)]
mtx
# b c d …Run Code Online (Sandbox Code Playgroud) 我想将我的数据从长格式转换为宽格式.如果发现reshape更改列标签真的很烦人,有什么方法可以避免这种情况吗?
例如,如果我有像这样的长格式数据:
Year Name Value
1996 a 1
1997 a 2
1998 b 3
1999 b 4
Run Code Online (Sandbox Code Playgroud)
我会用reshape()这样的
reshape(long, timevar = "Year", idvar = "Name", direction = "wide")
Run Code Online (Sandbox Code Playgroud)
转换本身工作正常,但列名称将如下所示:
Name Time.1996 Time.1997 Time.1998 Time.1999
Run Code Online (Sandbox Code Playgroud)
我现在唯一能想到的就是手动重命名列名,如果你必须为多个数据集做这件事,这真的很烦人.