我有一个数据框:
data_source <-c("s1", "s1", "s1", "s1", "s1", "s1")
lake <-c("blue lake", "blue lake", "blue lake", "mirror lake", "mirror lake",
"mirror lake")
sample <-c("upper", "mid", "bottom", "upper", "mid", "bottom")
df <-data.frame(cbind(data_source, lake, sample))
df我构造了以下id列:
df$source_id <-"s1"
df$lake_id <-paste(df$source_id, as.numeric(df$lake), sep = "_")
df$sample_id <-paste(df$lake_id, as.numeric(as.factor(df$lake_id)), sep = "_")但是,我希望sample_id列看起来像这样:
df$desired_id <-c("s1_l1_1", "s1_l1_2", "s1_l1_3", "s1_l2_1", "s1_l2_2", "s1_l2_3")
我不知道如何计算湖边的累积样本数。提前感谢!
发布于 2016-01-31 10:12:53
问题是您从不在lake_id列的湖号之前询问"l“,它会被传递到sample_id列。使用与您使用的代码类似的代码,我将执行以下操作:
df$lake_id <- with(df, paste0(source_id, "_l", as.numeric(df$lake)))
# "s1_l1" "s1_l1" "s1_l1" "s1_l2" "s1_l2" "s1_l2"这与现在的lake_id在湖号前包含一个"l“有所不同。
现在,通过运行代码的其余部分,您的代码将具有所需的sample_id。
在像这样把多个项目放在一起时,我更喜欢的编码风格是像这样使用sprintf:
df$sample_id <- with(df, sprintf("%s_l%d_%d", source_id, as.numeric(lake), as.numeric(lake)))有了这种编码风格,就更容易看到使用了什么以及它是如何连接的--使用sprintf格式化字符串增加了复杂性。
https://stackoverflow.com/questions/35109308
复制相似问题