想要创建一个基于r中另一列的值的列

时间:2020-08-04 19:50:37

标签: r dataframe

我当前的数据框看起来像这样

site   tree
 Y      Y1
 Y      Y2
 Y      Y3
 C      C1
 C      C2
 F      F1
 F      F2

我想添加一个附加列,该列基本上是与每个站点相对应的纬度(“ C” = 67.31949N,“ F” = 65.50790N,“ Y” = 65.84669N)。我如何在R中做到这一点?感谢您的任何建议!

我希望我的数据框看起来像什么

Site    Tree   Latitude
  Y      1     65.84669N
  Y      2     65.84669N
  Y      3     65.84669N
  C      1     67.31949N
  C      2     67.31949N
  F      1     65.50790N
  F      2     65.50790N

2 个答案:

答案 0 :(得分:1)

xyz <- c("C" = "67.31949N", "F" = "65.50790N", "Y" = "65.84669N")
dat$Latitude <- xyz[ dat$Site ]
dat
#   Site Tree  Latitude
# 1    Y    1 65.84669N
# 2    Y    2 65.84669N
# 3    Y    3 65.84669N
# 4    C    1 67.31949N
# 5    C    2 67.31949N
# 6    F    1 65.50790N
# 7    F    2 65.50790N

不过,最好是将参考数据放在一个框架中,

ref <- data.frame(
  site = c("C","F","Y"),
  Latitude = c("67.31949N", "65.50790N","65.84669N"),
  Longitude = c("75W", "76E", "77W")
)
merge(dat, ref, by = "site", all.x = TRUE)
#   site tree  Latitude Longitude
# 1    C   C1 67.31949N       75W
# 2    C   C2 67.31949N       75W
# 3    F   F1 65.50790N       76E
# 4    F   F2 65.50790N       76E
# 5    Y   Y1 65.84669N       77W
# 6    Y   Y2 65.84669N       77W
# 7    Y   Y3 65.84669N       77W

数据

dat <- structure(list(site = c("Y", "Y", "Y", "C", "C", "F", "F"), tree = c("Y1", 
"Y2", "Y3", "C1", "C2", "F1", "F2")), class = "data.frame", row.names = c(NA, 
-7L))

答案 1 :(得分:0)

还有一种类似于{r1evans的方法,它使用match和保存在数据框中的值:

#Data
df <- structure(list(site = c("Y", "Y", "Y", "C", "C", "F", "F"), tree = c("Y1", 
"Y2", "Y3", "C1", "C2", "F1", "F2")), row.names = c(NA, -7L), class = "data.frame")

#Keys
keys <- data.frame(site=c('C','F','Y'),val=c('67.31949N','65.50790N','65.84669N'),stringsAsFactors = F)
#Match
df$Latitude <- keys[match(df$site,keys$site),'val']

  site tree  Latitude
1    Y   Y1 65.84669N
2    Y   Y2 65.84669N
3    Y   Y3 65.84669N
4    C   C1 67.31949N
5    C   C2 67.31949N
6    F   F1 65.50790N
7    F   F2 65.50790N