如何基于R中现有列的值创建新列?

时间:2020-09-25 13:31:44

标签: r

我有一列处理名称,不幸的是,当前对处理进行了编码,以使1 = 0 kg N / ha,2 = 40 kg N / ha,3 = 80 kg N / ha,依此类推。我想添加一列用于每种处理的氮含量。

这是我尝试过的:

dput(head(df))
structure(list(Treatment = c("1", "10", "11", "12", "2", "3"), 
    slope = c(-355.55, -136.125, -137.6625, -96.5, -284.2375, 
    -334.5375)), row.names = 11:16, class = "data.frame")
df$Nrate[which(df$Treatment == 1)] = 0

我收到以下错误,我不明白,因为没有理由我看不出为什么新列应该比旧列短:

Error in `$<-.data.frame`(`*tmp*`, Nrate, value = c(0, NA, NA, NA, NA,  : 
  replacement has 49 rows, data has 60

此外,我不确定如何根据所有现有值创建整个列,其中处理1和7 = 0,处理2和8 = 40,处理3和9 = 80,处理4和10 = 120,处理5和11 = 160,处理6和12 =200。使用此代码,看起来它创建了一个包含NA的新列,其中的任意数字不是1,并且我怀疑如果我将新行写到将40替换为2时,它将不会保留1 = 0的信息。任何对要使用的正确软件包的了解或可以基于现有的新列创建新列的任何示例代码,将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以尝试这种方法。

df$Nrate <- factor(df$Treatment)
levels(df$Nrate)=list("0"=c(1, 7), "40"=c(2, 8), "80"=c(3, 9), 
               "120"=c(4, 10), "160"=c(5, 11), "200"=c(6, 12))
df
#    Treatment     slope Nrate
# 11         1 -355.5500     0
# 12        10 -136.1250   120
# 13        11 -137.6625   160
# 14        12  -96.5000   200
# 15         2 -284.2375    40
# 16         3 -334.5375    80