小编Hen*_*rik的帖子

通过数字索引在data.table中选择多个列

我们如何使用其数字索引(位置)的向量选择多个列data.table

这就是我们如何处理data.frame:

df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
#   b c
# 1 2 3
Run Code Online (Sandbox Code Playgroud)

r data.table

139
推荐指数
4
解决办法
16万
查看次数

如何防止ifelse()将Date对象转换为数字对象

我正在使用该函数ifelse()来操作日期向量.我期望结果是类Date,并且很惊讶地得到了一个numeric向量.这是一个例子:

dates <- as.Date(c('2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'))
dates <- ifelse(dates == '2011-01-01', dates - 1, dates)
str(dates)
Run Code Online (Sandbox Code Playgroud)

这尤其令人惊讶,因为在整个向量上执行操作会返回一个Date对象.

dates <- as.Date(c('2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04','2011-01-05'))
dates <- dates - 1
str(dates)
Run Code Online (Sandbox Code Playgroud)

我应该使用其他功能来操作Date矢量吗?如果是这样,有什么功能?如果没有,我如何强制ifelse返回与输入相同类型的向量?

帮助页面ifelse表明这是一个功能,而不是一个错误,但我仍然在努力寻找一个解释我发现的令人惊讶的行为.

datetime if-statement r

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

复制data.frame的每一行并指定每行的复制数

df <- data.frame(var1 = c('a', 'b', 'c'), var2 = c('d', 'e', 'f'),
                 freq = 1:3)
Run Code Online (Sandbox Code Playgroud)

扩展上面data.frame的前两列的最简单方法是什么,以便每行显示"freq"列中指定的次数?

换句话说,从这里开始:

df
  var1 var2 freq
1    a    d    1
2    b    e    2
3    c    f    3
Run Code Online (Sandbox Code Playgroud)

对此:

df.expanded
  var1 var2
1    a    d
2    b    e
3    b    e
4    c    f
5    c    f
6    c    f
Run Code Online (Sandbox Code Playgroud)

r replicate dataframe

128
推荐指数
8
解决办法
9万
查看次数

更改离散x刻度的顺序

我正在使用具有离散x刻度的ggplot制作一个躲闪条形图,x轴现在按字母顺序排列,但我需要重新排列它以便按y轴的值排序(即,最高的条形将位于左侧).

我尝试了排序或排序,但结果是对x轴进行排序,而不是分别对条形进行排序.

我做错了什么?

r ggplot2 r-faq

128
推荐指数
4
解决办法
23万
查看次数

为组合ggplots添加一个共同的图例

我有两个水平对齐的ggplots grid.arrange.我查看了很多论坛帖子,但我尝试的所有内容似乎都是现在更新并命名为其他内容的命令.

我的数据看起来像这样;

# Data plot 1                                   
        axis1     axis2   
group1 -0.212201  0.358867
group2 -0.279756 -0.126194
group3  0.186860 -0.203273
group4  0.417117 -0.002592
group1 -0.212201  0.358867
group2 -0.279756 -0.126194
group3  0.186860 -0.203273
group4  0.186860 -0.203273

# Data plot 2   
        axis1     axis2
group1  0.211826 -0.306214
group2 -0.072626  0.104988
group3 -0.072626  0.104988
group4 -0.072626  0.104988
group1  0.211826 -0.306214
group2 -0.072626  0.104988
group3 -0.072626  0.104988
group4 -0.072626  0.104988

#And I run this:
library(ggplot2)
library(gridExtra)


groups=c('group1','group2','group3','group4','group1','group2','group3','group4')

x1=data1[,1]
y1=data1[,2]

x2=data2[,1]
y2=data2[,2]

p1=ggplot(data1, aes(x=x1, y=y1,colour=groups)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8) …
Run Code Online (Sandbox Code Playgroud)

r legend ggplot2 gridextra

118
推荐指数
9
解决办法
9万
查看次数

为什么X [Y]连接data.tables不允许完全外连接或左连接?

这是关于data.table连接语法的一个哲学问题.我发现data.tables的用途越来越多,但仍在学习......

X[Y]data.tables 的连接格式非常简洁,方便和高效,但据我所知,它只支持内连接和右外连接.要获得左外部或全外部连接,我需要使用merge:

  • X[Y, nomatch = NA] - Y中的所有行 - 右外连接(默认)
  • X[Y, nomatch = 0] - 只有在X和Y中都匹配的行 - 内连接
  • merge(X, Y, all = TRUE) - 来自X和Y的所有行 - 完全外部连接
  • merge(X, Y, all.x = TRUE) - X中的所有行 - 左外连接

在我看来,如果X[Y]连接格式支持所有4种类型的连接,那将会很方便.有没有理由只支持两种类型的连接?

对我来说,nomatch = 0nomatch = NA参数值对于正在执行的操作不是非常直观.这是我更容易理解和记忆的merge语法:all = TRUE,all.x = TRUEall.y = TRUE.由于X[Y]操作类似于merge远远不止match,为什么不使用merge的连接,而不是语法match功能的nomatch参数?

以下是4种连接类型的代码示例:

# …
Run Code Online (Sandbox Code Playgroud)

join r data.table

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

重新排序因子的级别而不更改值的顺序

我的数据框有一些数值变量和一些分类factor变量.这些因素的等级顺序不是我希望它们的方式.

numbers <- 1:4
letters <- factor(c("a", "b", "c", "d"))
df <- data.frame(numbers, letters)
df
#   numbers letters
# 1       1       a
# 2       2       b
# 3       3       c
# 4       4       d
Run Code Online (Sandbox Code Playgroud)

如果我更改了级别的顺序,则这些字母不再带有相应的数字(我的数据从这一点开始是完全无意义的).

levels(df$letters) <- c("d", "c", "b", "a")
df
#   numbers letters
# 1       1       d
# 2       2       c
# 3       3       b
# 4       4       a
Run Code Online (Sandbox Code Playgroud)

我只想更改级别顺序,因此在绘图时,条形图按所需顺序显示 - 可能与默认的字母顺序不同.

r levels

114
推荐指数
5
解决办法
8万
查看次数

从zoo :: yearmon对象中提取月份和年份

我有一个yearmon对象:

require(zoo)
date1 <- as.yearmon("Mar 2012", "%b %Y")
class(date1)
# [1] "yearmon"
Run Code Online (Sandbox Code Playgroud)

如何从中提取月份和年份?

month1 <- fn(date1)
year1 <- fn(date1)
Run Code Online (Sandbox Code Playgroud)

我应该用什么功能代替 fn()

r

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

如何重新排序data.table列(无需复制)

data.table x鉴于列名称的字符向量,我想重新排序我的列neworder:

library(data.table)
x <- data.table(a = 1:3, b = 3:1, c = runif(3))
neworder <- c("c", "b", "a")
Run Code Online (Sandbox Code Playgroud)

显然我可以这样做:

x[ , neworder, with = FALSE]
# or
x[ , ..neworder]
#            c b a
# 1: 0.8476623 3 1
# 2: 0.4787768 2 2
# 3: 0.3570803 1 3
Run Code Online (Sandbox Code Playgroud)

但这需要再次复制整个数据集.还有另一种方法吗?

r data.table

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

使用美学和geom_text时,从图例中删除"a"

如何从此代码生成的图例中删除字母"a"?如果我删除了geom_text,那么'a'字母将不会显示在图例中.不过我想保留geom_text.

ggplot(data = iris, aes(x = Sepal.Length, y=Sepal.Width, shape = Species, colour = Species)) + 
   geom_point() + 
   geom_text(aes(label = Species))
Run Code Online (Sandbox Code Playgroud)

r ggplot2 aesthetics

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