小编Hen*_*rik的帖子

创建堆叠的条形图,其中每个堆栈按比例缩放为100%

我有一个像这样的data.frame:

df <- read.csv(text = "ONE,TWO,THREE
                       23,234,324
                       34,534,12
                       56,324,124
                       34,234,124
                       123,534,654")
Run Code Online (Sandbox Code Playgroud)

我想生成一个百分比条形图,看起来像这样(在LibreOffice Calc中制作): 在此输入图像描述

因此,条形应该标准化,因此所有堆叠具有相同的高度并且总和为100%.到目前为止,我所能获得的是一个堆积的条形图(不是百分比),使用:

barplot(as.matrix(df))
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

r ggplot2

61
推荐指数
4
解决办法
11万
查看次数

根据向量中的值从数据框中选择行

我有类似这样的数据:

dt <- structure(list(fct = structure(c(1L, 2L, 3L, 4L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), X = c(2L, 4L, 3L, 2L, 5L, 4L, 7L, 2L, 9L, 1L, 4L, 2L, 5L, 4L, 2L)), .Names = c("fct", "X"), class = "data.frame", row.names = c(NA, -15L))
Run Code Online (Sandbox Code Playgroud)

我想根据fct变量中的值从这个数据框中选择行.例如,如果我希望选择包含"a"或"c"的行,我可以这样做:

dt[dt$fct == 'a' | dt$fct == 'c', ]
Run Code Online (Sandbox Code Playgroud)

产量

1    a 2
3    c 3
5    c 5
7    a …
Run Code Online (Sandbox Code Playgroud)

r subset r-faq

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

如何在每个组中创建滞后变量?

我有一个data.table:

set.seed(1)
data <- data.table(time = c(1:3, 1:4),
                   groups = c(rep(c("b", "a"), c(3, 4))),
                   value = rnorm(7))

data
#    groups time      value
# 1:      b    1 -0.6264538
# 2:      b    2  0.1836433
# 3:      b    3 -0.8356286
# 4:      a    1  1.5952808
# 5:      a    2  0.3295078
# 6:      a    3 -0.8204684
# 7:      a    4  0.4874291
Run Code Online (Sandbox Code Playgroud)

我想每个"组"级别计算"值"列的滞后版本.

结果应该是这样的

#   groups time      value  lag.value
# 1      a    1  1.5952808         NA
# 2      a    2  0.3295078  1.5952808 …
Run Code Online (Sandbox Code Playgroud)

r plyr dplyr data.table

58
推荐指数
4
解决办法
6万
查看次数

R如何用小数秒格式化POSIXct

我认为R错误地使用小数秒格式化POSIXct类型.我通过R-bugs提交了这个作为增强请求的内容,并且"我们认为当前的行为是正确的 - 删除了bug".虽然我非常感谢他们已经完成并将继续做的工作,但我想让其他人对这个特定问题采取行动,并且可能就如何更有效地提出要点提出建议.

这是一个例子:

 > tt <- as.POSIXct('2011-10-11 07:49:36.3')
 > strftime(tt,'%Y-%m-%d %H:%M:%OS1')
 [1] "2011-10-11 07:49:36.2"
Run Code Online (Sandbox Code Playgroud)

也就是说,tt创建为POSIXct时间,小数部分.3秒.当使用一个十进制数字打印时,显示的值为.2.我使用毫秒级精度的时间戳工作很多,这让我很烦恼,因为时间通常比实际值低一个等级.

以下是发生的事情:POSIXct是自纪元以来的浮点秒数.精确处理所有整数值,但在base-2浮点中,与.3最接近的值略小于.3.strftime()格式的所述行为%OSn是向下舍入到请求的小数位数,因此显示的结果为.2.对于其他小数部分,浮点值略高于输入的值,显示屏给出预期结果:

 > tt <- as.POSIXct('2011-10-11 07:49:36.4')
 > strftime(tt,'%Y-%m-%d %H:%M:%OS1')
 [1] "2011-10-11 07:49:36.4"
Run Code Online (Sandbox Code Playgroud)

开发人员的论点是,对于时间类型,我们应该总是向下舍入到请求的精度.例如,如果时间是11:59:59.8,那么用格式打印它%H:%M应该给出"11:59"而不是"12:00",并且%H:%M:%S 应该给出"11:59:59"而不是"12:00:00".我同意这个整数秒和格式标志%S,但我认为对于为小数部分秒设计的格式标志,行为应该是不同的.我希望看到%OSn使用舍入到最近的行为,即使是n = 0同时%S使用循环下来,从而使打印11:59:59.8与格式%H:%M:%OS0将给"12:00:00".这不会影响整数秒的任何事情,因为它们总是精确地表示,但它会更自然地处理小数秒的舍入误差.

这就是如何处理小数部分的打印,例如C,因为整数转换向下舍入:

 double x = 9.97;
 printf("%d\n",(int) x);   //  9
 printf("%.0f\n",x);       //  10
 printf("%.1f\n",x);       //  10.0
 printf("%.2f\n",x);       //  9.97
Run Code Online (Sandbox Code Playgroud)

我做了一个关于如何在其他语言和环境中处理小数秒的快速调查,并且似乎确实没有达成共识.大多数构造设计为整数秒,而小数部分是事后想法.在我看来,在这种情况下,R开发人员做出的选择并非完全不合理,但实际上并不是最好的选择,并且与其他地方用于显示浮点数的约定不一致.

人们的想法是什么?R行为是否正确?这是你自己设计它的方式吗?

r posixct

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

将字符串切割成固定宽度字符元素的向量

我有一个包含文本字符串的对象:

x <- "xxyyxyxy"
Run Code Online (Sandbox Code Playgroud)

我想把它拆分成一个向量,每个元素包含两个字母:

[1] "xx" "yy" "xy" "xy"
Run Code Online (Sandbox Code Playgroud)

看起来strsplit应该是我的票,但由于我没有正则表达式foo,我无法弄清楚如何使这个功能将字符串按照我想要的方式切成块.我该怎么做?

r strsplit

53
推荐指数
7
解决办法
6万
查看次数

按组计算连续行中的值之间的差异

这是我的df(data.frame):

group value
1     10
1     20
1     25
2     5
2     10
2     15 
Run Code Online (Sandbox Code Playgroud)

我需要按组计算连续行中值之间的差异.

所以,我需要一个结果.

group value diff
1     10    NA # because there is a no previous value
1     20    10 # value[2] - value[1]
1     25    5  # value[3] value[2]
2     5     NA # because group is changed
2     10    5  # value[5] - value[4]
2     15    5  # value[6] - value[5]
Run Code Online (Sandbox Code Playgroud)

虽然,我可以通过使用来处理这个问题ddply,但需要花费太多时间.这是因为我的团队中有很多团体df.(我的超过1,000,000个团体df)

有没有其他有效的方法来处理这个问题?

r

53
推荐指数
2
解决办法
4万
查看次数

为什么TRUE =="TRUE"在R中为TRUE?

  1. 为什么TRUE == "TRUE"TRUE在R'
  2. ===在R中有任何等价物吗?

更新:

这些都回归了FALSE:

TRUE == "True"
TRUE == "true"
TRUE == "T"
Run Code Online (Sandbox Code Playgroud)

唯一的TRUE价值是TRUE == "TRUE".

如果检查identical()一切正常.

第二次更新:

通过===运营商我的意思是检查的过程数据类型一的变量.在这种情况下,我假设==操作符只会比较变量的,而不是它们的数据类型.

comparison boolean-logic boolean r

53
推荐指数
2
解决办法
2828
查看次数

清理因子水平(折叠多个级别/标签)

清理包含需要折叠的多个级别的因子的最有效(即有效/适当)方法是什么?也就是说,如何将两个或多个因子级别组合成一个.

这是一个示例,其中"是"和"Y"这两个级别应折叠为"是","否"和"N"折叠为"否":

## Given: 
x <- c("Y", "Y", "Yes", "N", "No", "H")   # The 'H' should be treated as NA

## expectedOutput
[1] Yes  Yes  Yes  No   No   <NA>
Levels: Yes No  # <~~ NOTICE ONLY **TWO** LEVELS
Run Code Online (Sandbox Code Playgroud)

一个选择当然是在手工使用sub和朋友之前清理琴弦.

另一种方法是允许重复标签,然后丢弃它们

## Duplicate levels ==> "Warning: deprecated"
x.f <- factor(x, levels=c("Y", "Yes", "No", "N"), labels=c("Yes", "Yes", "No", "No"))

## the above line can be wrapped in either of the next two lines
factor(x.f)      
droplevels(x.f) 
Run Code Online (Sandbox Code Playgroud)

但是,有更有效的方法吗?


虽然我知道levels …

r factors r-faq

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

将列移动到数据框中的第一个位置

我想将数据框的最后一列移到开头(作为第一列).我怎么能在R?

我的data.frame有大约一千列来改变订单.我只想选择一列并"将其移至开头".

r dataframe

52
推荐指数
8
解决办法
6万
查看次数

dplyr中的标准评估:summarise_作为字符串给出的变量

我想在一个内部引用一个未知的列名summarise.dplyr 0.3允许使用变量引用列名称中引入的标准评估函数,但是当您base在例如a中调用R函数时,这似乎不起作用summarise.

library(dplyr)

key <- "v3"
val <- "v2"
drp <- "v1"

df <- data_frame(v1 = 1:5, v2 = 6:10, v3 = c(rep("A", 3), rep("B", 2)))
Run Code Online (Sandbox Code Playgroud)

df看起来像这样:

> df
Source: local data frame [5 x 3]

  v1 v2 v3
1  1  6  A
2  2  7  A
3  3  8  A
4  4  9  B
5  5 10  B
Run Code Online (Sandbox Code Playgroud)

我想放弃v1,按v3分组,并为每个组加上v2:

df %>% select(-matches(drp)) %>% group_by_(key) %>% summarise_(sum(val, na.rm = TRUE))

Error in …
Run Code Online (Sandbox Code Playgroud)

r dplyr

48
推荐指数
5
解决办法
2万
查看次数