我是新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行。
答案 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