根据其他列的值添加列

时间:2017-05-26 11:33:36

标签: r dataframe

变量Jaehrlichkeit基本上是一个包含3个级别的因素:HQ30HQ100HQ300。我希望R阅读Jaehrlichkeit。如果Jaehrlichkeit = HQ30,请复制相应行中intHQ30列中的值,并将其粘贴到新创建的列Intensitaet中。对HQ100HQ300重复此操作。

我试图将mutate函数与嵌套ifelse结合起来,但不断收到错误。可以请别人帮帮我吗?或者可能建议一个更简单的解决方案?

3 个答案:

答案 0 :(得分:1)

我们可以使用row/column索引执行此操作。使用\\d+获取以'int'开头,后跟'HQ'和一些数字(grep)的列的名称。然后,通过match使用行序列的'v1',cbind的子字符串intHQ获取每行的列索引,并使用该索引从{{1}中提取值}列并指定它来创建'Intensitaet'

v1 <- grep("^intHQ\\d+", names(sub1), value = TRUE)
sub1$Intensitaet <- sub1[v1][cbind(1:nrow(sub1), 
           match(sub1$Jaehrlichkeit, sub("int", "", v1)))]

答案 1 :(得分:1)

另一种选择是分裂和应用,即

do.call(rbind, lapply(split(df, df$Jaehrlichkeit), function(i) {
                      i$Intensitaet <- i[[grep(i$Jaehrlichkeit[1], names(i))]]; i
                                                              }))

答案 2 :(得分:0)

由于public static void PropertyValuesAreEquals<T>(object actual, object expected) { Assert.IsTrue(actual is T); Assert.IsTrue(expected is T); foreach (var property in typeof(T).GetProperties().Where(o => o.CanRead)) { var actualValue = property.GetValue(actual, null); var expectedValue = property.GetValue(expected, null); ... } } 属于类型因素,因此您可以执行此向量化操作:

Jaehrlichkeit
  • 首先,您按照r <- sub1[,match(paste0("int", levels(sub1$Jaehrlichkeit)), names(sub1))] sub1$Intensitaet <- r[cbind(seq(nrow(r)), as.numeric(sub1$Jaehrlichkeit))] 的顺序在数据框中获得列intHQ100intHQ30intHQ300的值。
  • 然后生成索引并创建levels(sub1$Jaehrlichkeit)列。