如何使用多个列中的响应来创建新列?

时间:2019-02-16 19:57:05

标签: r tidyr

我试图根据同一行中其他列的响应在数据框中创建一个新列。

我找到的大多数解决方案都是数字,而我的情况是角色。我想创建一个新列,如果该行中的任何观察结果为“ Detected”,则显示为“ Detected”,如果没有观察结果为“ Detected”,那么我希望新列响应为“ Negative”。在下面的情况下,我希望第1行(ID 1)具有第4列(Test4),该列基于“检测到”的响应显示为“检测到”

ID <- c(1, 2, 3, 4)
Test1 <- c("Detected", "Not Detected", "Detected", "Detected")
Test2 <- c("Detected", "Not Detected", "Detected", "Detected")
Test3 <- c("Not Detected", "Detected", "Not Detected", "Not Detected")

df = data.frame(ID, Test1, Test2, Test3)

    ID     Test1       Test2           Test3
    1   Detected    Detected    Not Detected
    2   Not Detected Not Detected    Detected
    3   Detected    Detected    Not Detected
    4   Detected    Detected    Not Detected

2 个答案:

答案 0 :(得分:3)

您可以这样做:

gopkg.in/mgo.v2

输出:

df$Test4 <- ifelse(rowSums(df == "Detected") > 0,
                   "Detected",
                   "Negative")

如果上述方法不起作用,则说明您的字符串结构可能有问题(例如,周围可能还有其他空格或其他字符)。

如果您发布数据的原始示例,将会有所帮助。您也可以尝试:

  ID        Test1        Test2        Test3    Test4
1  1     Detected     Detected Not Detected Detected
2  2 Not Detected Not Detected     Detected Detected
3  3     Detected     Detected Not Detected Detected
4  4     Detected     Detected Not Detected Detected

这意味着匹配的行不需要100%对应于df$Test4 <- ifelse( apply(df, 1, function(x) any(grepl("^(?!.*Not).*Detected.*$", x, perl = T))), "Detected", "Negative" ) (没有任何空格等),但是只需要出现在某个地方-没有Detected部分。 / p>

答案 1 :(得分:0)

对于此解决方案,请重写您的df并进行如下突变:

method BubbleSort(arr: array<int>)
    ensures forall k, k' :: 0 <= k < k' < arr.Length ==> arr[k] <= arr[k']
    modifies arr
{
    var i := arr.Length;
    while i > 0
        invariant 0 <= i <= arr.Length
        // Violating the invariant next line
        invariant forall k, k' :: i <= k < k' < arr.Length ==> arr[k] <= arr[k']
        decreases i
    {
        var j := 0;
        while j < i - 1
            invariant 0 <= j < i
            invariant forall k :: 0 <= k < j ==> arr[j] >= arr[k]
            decreases i - j
        {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] := arr[j+1], arr[j];
            }
            j := j + 1;
        }
        i := i - 1;
    }
}

希望这会有所帮助!