小编Tho*_*mas的帖子

如何在ifelse中包含NA?

我正在尝试ID基于其他列的值的逻辑语句创建列.例如,在以下数据框中

test <- structure(list(time = c(10L, 20L, NA, 30L), type = structure(c(1L, 
2L, 3L, NA), .Label = c("A", "B", "C"), class = "factor"), ID = c(NA, 
"1", NA, NA)), .Names = c("time", "type", "ID"), row.names = c(NA, 
-4L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

看起来像

    time    type
1   10      A
2   20      B
3   NA      C
4   30      NA
Run Code Online (Sandbox Code Playgroud)

我想打一个新列ID包含所有值为1的time不在NA,所有type不属于A.我使用以下代码:

test$ID <- ifelse(is.na(test$time) | test$type == "A", NA, "1")
Run Code Online (Sandbox Code Playgroud)

这给出了结果

    time …
Run Code Online (Sandbox Code Playgroud)

if-statement r

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

R或ggplot2中的默认绘图颜色是什么?

我正在绘制ggplot2并希望添加一些颜色与点相同的线条.任何人都可以告诉我在R中绘图时默认的颜色代码是什么?例如,以下6种颜色的代码是什么:

df <- structure(list(type = structure(1:6, .Label = c("a", "b", "c", 
"d", "e", "f"), class = "factor"), value = 1:6), .Names = c("type", 
"value"), class = "data.frame", row.names = c(NA, -6L))

library(ggplot2)
ggplot(df, aes(x=value, y=value, color=type)) + geom_point(shape=21, size=4)
Run Code Online (Sandbox Code Playgroud)

谢谢!

plot r ggplot2

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

ggplot2:在绘图顶部添加二次变换的x轴

[ 编辑2016年4月:此线程中的解决方案不再正确显示添加的轴 - 此问题的新线程已在ggplot2打开2.1.0打破了我的代码?二次变换轴现在显示不正确 ]

我正在使用缩放的x数据,并且需要在绘图顶部添加一个未缩放的x轴以便于解释.我遇到了一个添加辅助y轴的方法我如何在ggplot2的右侧放置一个转换后的比例?.但是,我无法让它在x轴上正常工作.我确定我不理解代码的某些部分,但我似乎无法弄清楚它是什么.我已经尝试过查看ggplot2帮助文件,以及Wickham书籍ggplot2:数据分析的优雅图形,但如果有人能指出我的一些相关文档,我会非常感激!

我正在使用温度数据,但是我将使用上面链接中的湖泊数据作为代码.以下是该链接的原始代码:

library(ggplot2)
library(gtable)
library(grid)
LakeLevels<-data.frame(Day=c(1:365),Elevation=sin(seq(0,2*pi,2*pi/364))*10+100)
p1 <- ggplot(data=LakeLevels) + geom_line(aes(x=Day,y=Elevation)) + 
      scale_y_continuous(name="Elevation (m)",limits=c(75,125))

p2<-ggplot(data=LakeLevels)+geom_line(aes(x=Day, y=Elevation))+
    scale_y_continuous(name="Elevation (ft)", limits=c(75,125),           
    breaks=c(80,90,100,110,120),
             labels=c("262", "295", "328", "361", "394"))

#extract gtable
g1<-ggplot_gtable(ggplot_build(p1))
g2<-ggplot_gtable(ggplot_build(p2))

#overlap the panel of the 2nd plot on that of the 1st plot

pp<-c(subset(g1$layout, name=="panel", se=t:r))
g<-gtable_add_grob(g1, g2$grobs[[which(g2$layout$name=="panel")]], pp$t, pp$l, pp$b, 
                   pp$l)

ia <- which(g2$layout$name == "axis-l")
ga <- g2$grobs[[ia]]
ax <- ga$children[[2]]
ax$widths <- rev(ax$widths)
ax$grobs <- rev(ax$grobs) …
Run Code Online (Sandbox Code Playgroud)

r ggplot2

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

如何在R中仅在两列中省略NA的行?

我想省略中行NA出现在这两个2列.

我很熟悉na.omit,is.nacomplete.cases,但无法弄清楚如何使用这些得到我想要的东西.例如,我有以下数据帧:

(df <- structure(list(x = c(1L, 2L, NA, 3L, NA),
                     y = c(4L, 5L, NA, 6L, 7L),
                     z = c(8L, 9L, 10L, 11L, NA)),
                .Names = c("x", "y", "z"),
                class = "data.frame",
                row.names = c(NA, -5L)))
x   y   z
1   4   8
2   5   9
NA  NA  10
3   6   11
NA  7   NA
Run Code Online (Sandbox Code Playgroud)

并且我想删除那些NA出现在xy列中的行(不包括z中的任何内容),以便给出

x   y   z
1 …
Run Code Online (Sandbox Code Playgroud)

r na

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

如何使用其列之一的值过滤/子集data.frame

如何根据单个列中的值"截断"data.frame?例如,如果我有这个矩阵

x <- c(5,1,3,2,4)
y <- c(1,5,3,4,2)
data <- data.frame(x,y)
Run Code Online (Sandbox Code Playgroud)

我希望所有数据的值都大于或等于x,我该怎么做?我知道我可以使用找到x值的地址

addresses <- which(x>=2)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用它来制作新的矩阵.以下不起作用:

data2 <- data[x>=2]
data2 <- data[which(x>=2)]
Run Code Online (Sandbox Code Playgroud)

如果有人可以提供任何建议,我真的很感激.

r dataframe

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

如何在R中指定"切割"范围中点?

我正在使用cut将数据划分为多个二进制文件,这样就可以生成垃圾箱(x1,x2].任何人都可以告诉我如何制作一个表达这些箱子作为箱子中点的新栏目?例如,使用以下数据帧:

structure(list(x = c(1L, 4L, 6L, 7L, 8L, 9L, 12L, 18L, 19L), 
    y = 1:9), .Names = c("x", "y"), class = "data.frame", row.names = c(NA, 
-9L))
Run Code Online (Sandbox Code Playgroud)

我可以用

test$xRange <- cut(test$x, breaks=seq(0, 20, 5))
Run Code Online (Sandbox Code Playgroud)

    x   y   xRange
1   1   1   (0,5]
2   4   2   (0,5]
3   6   3   (5,10]
4   7   4   (5,10]
5   8   5   (5,10]
6   9   6   (5,10]
7   12  7   (10,15]
8   18  8   (15,20]
9   19  9   (15,20]
Run Code Online (Sandbox Code Playgroud)

但我需要的结果应该是:

    x   y …
Run Code Online (Sandbox Code Playgroud)

r hmisc

7
推荐指数
1
解决办法
2624
查看次数

如何计算R中每组的初始值的差异?

我在R中安排了这样的数据:

indv    time    val
A          6    5
A         10    10
A         12    7
B          8    4
B         10    3
B         15    9
Run Code Online (Sandbox Code Playgroud)

对于每次每个人(indv),我想val从初始时间计算值()的变化.所以我最终得到这样的东西:

indv time   val val_1   val_change
A       6     5    5       0
A      10    10    5       5
A      12     7    5       2
B       8     4    4       0
B      10     3    4      -1
B      15     9    4       5
Run Code Online (Sandbox Code Playgroud)

有人能告诉我怎么做这个吗?我可以用

ddply(df, .(indv), function(x)x[which.min(x$time), ])
Run Code Online (Sandbox Code Playgroud)

得到一张像这样的桌子

indv    time    val
A          6    5   
B          8    4   
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何制作一个列val_1,其中每个人的最小值匹配.但是,如果我可以这样做,我应该可以 …

r

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

R - 如何将不同的函数应用于列中的某些行

我试图根据相邻列中的字符串值将不同的函数应用于不同的行.我的数据框看起来像这样:

type    size
A       1
B       3
A       4
C       2
C       5
A       4
B       32
C       3
Run Code Online (Sandbox Code Playgroud)

我想对A,B和C类型应用不同的函数,以给出第三列"size2"列.例如,假设以下函数适用于A,B和C:

for A: size2 = 3*size
for B: size2 = size
for C: size2 = 2*size 
Run Code Online (Sandbox Code Playgroud)

我可以使用此代码分别为每种类型执行此操作

df$size2 <- ifelse(df$type == "A", 3*df$size, NA)
df$size2 <- ifelse(df$type == "B", 1*df$size, NA)
df$size2 <- ifelse(df$type == "C", 2*df$size, NA)
Run Code Online (Sandbox Code Playgroud)

但是,在没有删除所有其他值的情况下,我似乎无法对所有类型执行此操作.我试图使用此代码将函数的应用程序仅限制为NA的值(即保留现有值并仅填充NA值),但使用此代码时无效:

df$size2 <- ifelse(is.na(df$size2), ifelse(df$type == "C", 2*df$size, NA), NA)
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法?是否有可能使用某种类型和语句"is.na(DF size2个$)"和"ifelse(DF $类型=='C’"?

非常感谢!

r

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

ggplot2:刻度标记作为基本e指数

我在对数转换的轴上绘制数据,并且ggplot中的默认设置是对刻度标签使用指数。但是,我想包括基数e,以便刻度标签显示为“ e ^ n”。有人知道我该怎么做吗?我可以找到以10为底的指数的解决方案(例如,ggplot中的对数刻度的漂亮轴标签),但是没有以e为底的解决方案。我曾尝试修改base 10解决方案以获取base e指数,但是它不适用于我。

此示例显示默认行为:

library(ggplot2)
df <- data.frame(x=c(10, 100), y=c(400, 23000))
ggplot(df, aes(x=x, y=log(y)))+geom_line()
Run Code Online (Sandbox Code Playgroud)

我可以使用以下格式以科学格式表示刻度标签

ggplot(df, aes(x=x, y=log(y)))+geom_line()+scale_y_continuous(label=scientific)
Run Code Online (Sandbox Code Playgroud)

但我反而希望这些标签显示为e^n。有人可以在这里指出正确的方向吗?

编辑:Didzis的解决方案完美地工作,但当使用这样的较小的y范围时

df <- data.frame(x=c(10, 100), y=c(400, 3000))
Run Code Online (Sandbox Code Playgroud)

刻度线以小数(例如e ^ 6.5)而不是整数(例如e ^ 6,e ^ 7)的形式出现。如何强制ggplot仅使用整数?我试过了

ggplot(df, aes(x=x, y=y))+geom_line()+
+     scale_y_continuous(trans="log",breaks = trans_breaks("log", function(x) exp(x), by=1),
+                        labels = trans_format("log", math_format(e^.x)))
Run Code Online (Sandbox Code Playgroud)

但这没有用。

EDIT2:我可以通过使用以下方法设置中断次数来解决此问题:

ggplot(df, aes(x=x, y=y))+geom_line()+
scale_y_continuous(trans="log",breaks = trans_breaks("log", function(x) exp(x), n=3),
                   labels = trans_format("log", math_format(e^.x)))
Run Code Online (Sandbox Code Playgroud)

r ggplot2

5
推荐指数
1
解决办法
2325
查看次数

ggplot2 2.1.0破坏了我的代码?现在,辅助变换轴显示不正确

前一段时间,我询问是否要在ggplot中添加辅助变换的x轴,Nate Pope提供了ggplot2中描述的出色解决方案plot顶部添加辅助变换的x轴

该解决方案对我来说非常有效,我又返回了它,希望它可以用于新项目。不幸的是,该解决方案在ggplot2的最新版本中无法正常工作。现在,运行完全相同的代码将导致轴标题“剪切”,以及刻度线和标签重叠。这是一个示例,问题以蓝色突出显示:

在此处输入图片说明

可以使用以下代码来复制此示例(这是Nate Pope以前工作出色的代码的精确副本):

library(ggplot2)
library(gtable)
library(grid)

LakeLevels<-data.frame(Day=c(1:365),Elevation=sin(seq(0,2*pi,2*pi/364))*10+100)

## 'base' plot
p1 <- ggplot(data=LakeLevels) + geom_line(aes(x=Elevation,y=Day)) + 
  scale_x_continuous(name="Elevation (m)",limits=c(75,125)) +
  ggtitle("stuff") +
  theme(legend.position="none", plot.title=element_text(hjust=0.94, margin = margin(t = 20, b = -20)))

## plot with "transformed" axis
p2<-ggplot(data=LakeLevels)+geom_line(aes(x=Elevation, y=Day))+
  scale_x_continuous(name="Elevation (ft)", limits=c(75,125),
                     breaks=c(90,101,120),
                     labels=round(c(90,101,120)*3.24084) ## labels convert to feet
  )

## extract gtable
g1 <- ggplot_gtable(ggplot_build(p1))
g2 <- ggplot_gtable(ggplot_build(p2))

## overlap the panel of the 2nd plot …
Run Code Online (Sandbox Code Playgroud)

r ggplot2 gtable

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

标签 统计

r ×10

ggplot2 ×4

dataframe ×1

gtable ×1

hmisc ×1

if-statement ×1

na ×1

plot ×1