小编Jaa*_*aap的帖子

复杂的重塑

我想重塑我的数据帧从长格式到宽格式,我放弃了一些我想保留的数据.对于以下示例:

df <- data.frame(Par1 = unlist(strsplit("AABBCCC","")),
                 Par2 = unlist(strsplit("DDEEFFF","")),
                 ParD = unlist(strsplit("foo,bar,baz,qux,bla,xyz,meh",",")),
                 Type = unlist(strsplit("pre,post,pre,post,pre,post,post",",")),
                 Val = c(10,20,30,40,50,60,70))

   #     Par1 Par2 ParD Type Val
   #   1    A    D  foo  pre  10
   #   2    A    D  bar post  20
   #   3    B    E  baz  pre  30
   #   4    B    E  qux post  40
   #   5    C    F  bla  pre  50
   #   6    C    F  xyz post  60
   #   7    C    F  meh post  70

dfw <- dcast(df,
             formula = Par1 + …
Run Code Online (Sandbox Code Playgroud)

r dataframe reshape2

19
推荐指数
5
解决办法
877
查看次数

在一个图中绘制多条线

尝试使用ggplot将多行绘制成一个图形,但不确定如何使用我的数据集.不确定我是否需要更改数据结构(转置?)

数据如下所示:

Company   2011   2013
Company1  300    350
Company2  320    430
Company3  310    420
Run Code Online (Sandbox Code Playgroud)

我也试过它转置:

Year   Company1  Company2  Company3
2011   300       320       310 
2013   350       430       420
Run Code Online (Sandbox Code Playgroud)

为此我可以使用绘制1个值;

ggplot(data=df, aes(x=Year, y=Company1)) + geom_line(colour="red") + geom_point(colour="red", size=4, shape=21, fill="white")
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将所有公司合并,因为我没有对象'公司'了.有什么建议?

r linegraph ggplot2

19
推荐指数
2
解决办法
12万
查看次数

如何调整R中的future.global.maxSize?

任何人都可以帮我弄清楚如何更改传递给未来包中的项目的全局对象的最大大小?

这是一个无用的例子,显示了我的观点

library(future)
a = 1:200000000
object.size(a)
test %<-% head(a)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

getGlobalsAndPackages中的错误(expr,envir = envir,persistent = persistent,:为将来的表达式('head(a)')需要导出的所有全局对象的总大小为762.95 MiB.这超出了允许的最大大小500.00 MiB(选项'future.global.maxSize').有两个全局变量:'a'(762.94 MiB类'numeric')和'head'(10.05 KiB类'function').

任何人都可以帮我理解如何调整future.global.maxSize选项吗?我试过options(future.global.maxSize = 1500000)但是没用.

future r options

19
推荐指数
1
解决办法
3268
查看次数

按组添加一列均值到原始数据

我想基于因子列添加一列均值R data.frame.像这样:

df1 <- data.frame(X = rep(x = LETTERS[1:2], each = 3), Y = 1:6)
df2 <- aggregate(data = df1, Y ~ X, FUN = mean)
df3 <- merge(x = df1, y = df2, by = "X", suffixes = c(".Old",".New"))
df3
#   X Y.Old Y.New
# 1 A     1     2
# 2 A     2     2
# 3 A     3     2
# 4 B     4     5
# 5 B     5     5
# 6 B     6     5
Run Code Online (Sandbox Code Playgroud)

要完成这个问题,我要创建两个不必要的data.frames.我想知道一种方法,可以通过因子列将一列方法附加到我的原始列中 …

r dataframe

18
推荐指数
3
解决办法
3万
查看次数

从长到宽格式转换/重塑数据帧而不使用"timevar"

我有一个数据框,遵循以下长模式:

   Name          MedName
  Name1    atenolol 25mg
  Name1     aspirin 81mg
  Name1 sildenafil 100mg
  Name2    atenolol 50mg
  Name2   enalapril 20mg
Run Code Online (Sandbox Code Playgroud)

并希望得到以下(我不在乎我是否可以这样命名列,只是想要这种格式的数据):

   Name   medication1    medication2      medication3
  Name1 atenolol 25mg   aspirin 81mg sildenafil 100mg
  Name2 atenolol 50mg enalapril 20mg             NA
Run Code Online (Sandbox Code Playgroud)

通过这个网站,我已经熟悉了reshape/reshape2包,并经历了多次尝试,试图让它工作,但迄今为止失败了.

当我尝试时,dcast(dataframe, Name ~ MedName, value.var='MedName')我只得到一堆列为药物名称的标志(转换的值为1或0)示例:

 Name  atenolol 25mg  aspirin 81mg
Name1              1             1
Name2              0             0 
Run Code Online (Sandbox Code Playgroud)

我在尝试dcast(dataset, Name ~ variable)融化数据集后尝试过,但这只是吐出以下内容(只计算每个人有多少药物):

 Name  MedName
Name1        3
name2        2
Run Code Online (Sandbox Code Playgroud)

最后,我试图融化数据,然后重塑使用idvar="Name" timevar="variable"(其中所有只是Mednames),但是这似乎不是为我的问题构建的,因为如果有多个匹配到idvar,重塑只需要第一个MedName并忽略休息.

有谁知道如何使用重塑或其他R功能这样做?我意识到可能有一种方法以更杂乱的方式执行此操作,其中一些for循环和条件基本上分割并重新粘贴数据,但我希望有一个更简单的解决方案.非常感谢!

transpose r reshape r-faq

18
推荐指数
6
解决办法
4980
查看次数

识别数据框中的重复列

我是R新手,我正试图从较大的数据框(50K行,215列)中删除重复的列.框架具有离散的连续和分类变量的混合.

我的方法是为框架中的每一列生成一个表到一个列表,然后使用该duplicated()函数在列表中查找重复的行,如下所示:

age=18:29
height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5)
gender=c("M","F","M","M","F","F","M","M","F","M","F","M")
testframe = data.frame(age=age,height=height,height2=height,gender=gender,gender2=gender)

tables=apply(testframe,2,table)
dups=which(duplicated(tables))
testframe <- subset(testframe, select = -c(dups))
Run Code Online (Sandbox Code Playgroud)

这不是非常有效,特别是对于大型连续变量.但是,我已经走了这条路线,因为我无法使用摘要得到相同的结果(注意,以下假定原始testframe包含重复项):

summaries=apply(testframe,2,summary)
dups=which(duplicated(summaries))
testframe <- subset(testframe, select = -c(dups))
Run Code Online (Sandbox Code Playgroud)

如果您运行该代码,您将看到它只删除找到的第一个副本.我认为这是因为我做错了什么.任何人都可以指出我出错的地方,或者更好的是,我指出了从数据框中删除重复列的更好方法的方向?

r dataframe

17
推荐指数
3
解决办法
2万
查看次数

真数立方根的负数

我试图看看是否有一个函数来直接获得负数的真正立方根.例如,在Java中,有Math.cbrt()功能.我正在寻找R中的等价物.

否则,我目前的黑客是:

x <- -8
sign(x) * abs(x)^(1/3)
Run Code Online (Sandbox Code Playgroud)

每次打字都非常不优雅和麻烦.谢谢!

r

17
推荐指数
1
解决办法
1万
查看次数

在不改变绘图中的排序的情况下翻转图例的顺序

我发现当coord_flip()使用ggplot2 添加到某些图时,图例中值的顺序不再与图中值的顺序对齐.

例如:

dTbl = data.frame(x=c(1,2,3,4,5,6,7,8),
                  y=c('a','a','b','b','a','a','b','b'),
                  z=c('q','q','q','q','r','r','r','r'))

print(ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) +
      geom_bar(position=position_dodge(), stat='identity') +
      coord_flip() +
      theme(legend.position='top', legend.direction='vertical'))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我希望在不改变图中'q'和'r'的顺序的情况下反转图例中的'q'和'r'.

scale.x.reverse() 看起来很有希望,但似乎并没有在因素范围内起作用(就像这个条形图的情况一样).

r ggplot2

17
推荐指数
1
解决办法
6796
查看次数

一次重塑多个值

我有一个很长的数据集我想扩大,我很好奇是否有一种方法可以使用R中的reshape2或tidyr包一步完成所有这些操作.

数据框df如下所示:

id  type    transactions    amount
20  income       20          100
20  expense      25          95
30  income       50          300
30  expense      45          250
Run Code Online (Sandbox Code Playgroud)

我想谈谈这个问题:

id  income_transactions expense_transactions    income_amount   expense_amount
20       20                           25                 100             95
30       50                           45                 300             250
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过reshape2来获得部分路径,例如:

dcast(df, id ~  type, value.var="transactions")
Run Code Online (Sandbox Code Playgroud)

但有没有办法一次性重塑整个df,同时解决"交易"和"金额"变量?理想情况下,新的更合适的列名称?

r reshape dataframe reshape2 tidyr

17
推荐指数
2
解决办法
5912
查看次数

如何计算与数据的前一行的时间差

我试图解决的问题是我有一个数据框,其中包含一个排序的POSIXct变量.每行都被分类,我想获得每个级别的每一行之间的时间差异,并将该数据添加回一个新变量.可重现的问题如下.以下功能仅用于为此问题创建具有随机时间的样本数据.

random.time <- function(N, start, end) {
  st <- as.POSIXct(start)
  en <- as.POSIXct(end)
  dt <- as.numeric(difftime(en, st, unit="sec"))
  ev <- sort(runif(N, 0, dt))
  rt <- st + ev
  return(rt)
}
Run Code Online (Sandbox Code Playgroud)

模拟问题的代码如下:

set.seed(123)
category <- sample(LETTERS[1:5], 20, replace=TRUE)
randtime <- random.time(20, '2015/06/01 08:00:00', '2015/06/01 18:00:00')
df <- data.frame(category, randtime)
Run Code Online (Sandbox Code Playgroud)

预期的结果数据框如下:

>category randtime timediff (secs)
>A  2015-06-01 09:05:00 0
>A  2015-06-01 09:06:30 90
>A  2015-06-01 09:10:00 210
>B  2015-06-01 10:18:58 0
>B  2015-06-01 10:19:58 60
>C  2015-06-01 08:14:00 0
>C  2015-06-01 08:16:30 …
Run Code Online (Sandbox Code Playgroud)

datetime r posixct

17
推荐指数
2
解决办法
1万
查看次数

标签 统计

r ×10

dataframe ×4

ggplot2 ×2

reshape ×2

reshape2 ×2

datetime ×1

future ×1

linegraph ×1

options ×1

posixct ×1

r-faq ×1

tidyr ×1

transpose ×1