如何合并在R中创建一个只根据更新日期获取一个值的列

时间:2016-06-26 02:50:45

标签: r

我是新R并且下面有一个矩阵:

收益

0  Name     usd/day  update_year  usd/day update_year
1  John     52.0     2011         NA       NA
2  Mary     44.0     2012         NA       NA
3  Nicole   44.5     2000 est.    49.2     2010 est.
4  Cynthia   38.1    2001 est.    44.0     2011

我想清理R中的数据,只有3列 - Name,usd / day和update_year,得到这样的结果:

0  Name    usd/day  update_year
1  John    52.0     2011
2  Mary    44.0     2012
3  Nicole  49.2     2010
4  Cynthia 44.0     2011

我如何在R中做到这一点?

我不想手动组合它们,实际数据超过100行。

2 个答案:

答案 0 :(得分:2)

这应该有效。您似乎想要提取最近的日期(即年份)和美元的最高值。你需要做几件事。

首先,只保留update_year年;好像你不想要' EST&#39。在你的决赛桌上。我们可以使用gsub

来实现
df$update_year.x <- gsub("[^0-9]", "", df$update_year.x)
df$update_year.y <- gsub("[^0-9]", "", df$update_year.y)

找到最近的一年。

df$update_year <- apply(df[, c(4,6)], 1, max, na.rm=TRUE)

找出最高的美元价值。

df$usd.day <- apply(df[, c(3,5)], 1, max, na.rm=TRUE)

保留相关栏目。

df[, c("Name", "usd.day", "update_year")]

#     Name usd.day update_year
#1    John    52.0        2011
#2    Mary    44.0        2012
#3  Nicole    49.2        2010
#4 Cynthia    44.0        2011

数据

df <- read.table(text="
X0  Name     usd/day.x  update_year.x  usd/day.y update_year.y
1  John     52.0     2011         NA       NA
2  Mary     44.0     2012         NA       NA
3  Nicole   44.5     '2000 est.'    49.2     '2010 est.'
4  Cynthia   38.1    '2001 est.'    44.0     2011", header=TRUE,fill=TRUE,stringsAsFactors=FALSE)

正如您对答案的评论所指出的那样;有重复的列名称,这是一个问题。我通过在名称的末尾添加x / y来解决这个问题。

答案 1 :(得分:2)

我们可以在用pmax

替换值后使用gsub
update_year <- do.call(pmax, c(lapply(df[c(4,6)], function(x) 
                    as.numeric(gsub("\\D+", "", x))), list(na.rm=TRUE)))
`usd/day` <- do.call(pmax, c(df[c(3,5)], list(na.rm=TRUE)))   


cbind(df[1:2], `usd/day`, update_year)
#   0    Name   usd/day update_year
#1  1    John      52.0        2011
#2  2    Mary      44.0        2012
#3  3  Nicole      49.2        2010
#4  4 Cynthia      44.0        2011