首页 文章

R - 通过其他多列的条件运算创建列

提问于
浏览
0

我正在尝试使用以下逻辑创建一个新列:对于每一行,如果行名称为's',则新列将获取非空列总和(在子集中)的值,除非总和为零,在哪种情况下它应该取v1列的值 .

data.frame的一个例子

name   year   v1         COL1   COL2 COL3 COL4 COL5 COL6 COL7
 1  S   1960   0.00  0.000000000   NA   NA   NA   NA   NA   NA ...
 2  S   1961   0.00  0.000000000   NA   NA   NA   NA   NA   NA ...
 3  S   1962   0.00  0.000000000   NA   NA   NA   NA   NA   NA ...
 4  S   1963   0.00  0.000000000   NA   NA   NA   NA   NA   NA ...
 5  N   1964   0.00  0.000000000   NA   NA   55   NA   22   NA ...
 6  S   1965  -0.13 -0.160505952   NA   NA   NA   NA   NA   45 ...

等等 . 我正在尝试的代码示例:

df$nexcol <- 0
df$nexcol[df["name"]=="S"] <-ifelse(rowSums(!is.na(df[df["name"]=="S",5:106]))==0,
                             df[df["name"]=="S","V1"],rowSums(!is.na(df[df["name"]=="S",5:106])))
df$nexcol[df["name"]=="N"] <- 1

预期的结果是

name   year   v1         COL1   COL2 COL3 COL4 COL5 COL6 COL7 ... nexcol
 1  S   1960   2.00  0.000000000   NA   NA   NA   NA   NA   NA ...    2.00
 2  S   1961   3.00  0.000000000   NA   NA   NA   NA   NA   NA ...    3.00
 3  S   1962   4.00  0.000000000   52   NA   NA   NA   10   NA ...    2
 4  S   1963   2.00  0.000000000   NA   NA   NA   NA   NA   NA ...    2.00
 5  N   1964   3.00  0.000000000   NA   NA   55   NA   22   NA ...    1
 6  S   1965  -0.13 -0.160505952   NA   NA   NA   NA   NA   45 ...    1

1 回答

  • 1

    尝试类似这样的事情,接近你尝试过的东西,但更多的是 R 方式:

    df$nexcol = rowSums(!is.na(df[5:10]))
    df$nexcol = with(df, ifelse(name == 'N', 1, ifelse(nexcol == 0, v1, nexcol)))
    
    df
    #   name year    v1      COL1 COL2 COL3 COL4 COL5 COL6 COL7 nexcol
    # 1    S 1960  2.00  0.000000   NA   NA   NA   NA   NA   NA      2
    # 2    S 1961  3.00  0.000000   NA   NA   NA   NA   NA   NA      3
    # 3    S 1962  4.00  0.000000   52   NA   NA   NA   10   NA      2
    # 4    S 1963  2.00  0.000000   NA   NA   NA   NA   NA   NA      2
    # 5    N 1964  3.00  0.000000   NA   NA   55   NA   22   NA      1
    # 6    S 1965 -0.13 -0.160506   NA   NA   NA   NA   NA   45      1
    

    或者使用 dplyr 包:

    library(dplyr)
    df %>% mutate(nexcol = rowSums(!is.na(.[5:10])), 
                  nexcol = case_when(.$name == 'N' ~ 1, .$nexcol == 0 ~ .$v1, TRUE ~ .$nexcol))
    
    #   name year    v1      COL1 COL2 COL3 COL4 COL5 COL6 COL7 nexcol
    # 1    S 1960  2.00  0.000000   NA   NA   NA   NA   NA   NA      2
    # 2    S 1961  3.00  0.000000   NA   NA   NA   NA   NA   NA      3
    # 3    S 1962  4.00  0.000000   52   NA   NA   NA   10   NA      2
    # 4    S 1963  2.00  0.000000   NA   NA   NA   NA   NA   NA      2
    # 5    N 1964  3.00  0.000000   NA   NA   55   NA   22   NA      1
    # 6    S 1965 -0.13 -0.160506   NA   NA   NA   NA   NA   45      1
    

相关问题