我有一个像这样的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)
有帮助吗?
我有类似这样的数据:
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) 我有一个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错误地使用小数秒格式化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行为是否正确?这是你自己设计它的方式吗?
我有一个包含文本字符串的对象:
x <- "xxyyxyxy"
Run Code Online (Sandbox Code Playgroud)
我想把它拆分成一个向量,每个元素包含两个字母:
[1] "xx" "yy" "xy" "xy"
Run Code Online (Sandbox Code Playgroud)
看起来strsplit应该是我的票,但由于我没有正则表达式foo,我无法弄清楚如何使这个功能将字符串按照我想要的方式切成块.我该怎么做?
这是我的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)
有没有其他有效的方法来处理这个问题?
TRUE == "TRUE"是TRUE在R'===在R中有任何等价物吗?更新:
这些都回归了FALSE:
TRUE == "True"
TRUE == "true"
TRUE == "T"
Run Code Online (Sandbox Code Playgroud)
唯一的TRUE价值是TRUE == "TRUE".
如果检查identical()一切正常.
第二次更新:
通过===运营商我的意思是检查的过程值和数据类型一的变量.在这种情况下,我假设==操作符只会比较变量的值,而不是它们的数据类型.
清理包含需要折叠的多个级别的因子的最有效(即有效/适当)方法是什么?也就是说,如何将两个或多个因子级别组合成一个.
这是一个示例,其中"是"和"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?
我的data.frame有大约一千列来改变订单.我只想选择一列并"将其移至开头".
我想在一个内部引用一个未知的列名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)