循环多列以检查是否按行组织

时间:2017-07-24 02:47:29

标签: r

感谢您的帮助。我对R比较陌生,我还在学习如何正确地使用它来进行数据分析。 我目前的数据设置如下:

A   B   C   D   E   NEVER
NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  yes
NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  yes
NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  yes
NA  NA  NA  NA  NA  NA
NA  NA  NA  NA  NA  NA
NA  NA  NA  NA  NA  NA
NA  NA  NA  NA  NA  NA
NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  NOT APPLICABLE  yes
NA  NA  NA  NA  NA  NA
NA  NA  NA  NA  NA  NA
yes yes yes yes NA  NA
NA  NA  NA  NA  NA  NA
NA  no  no  NA  NA  NA
yes no  no  no  no  NA
yes NA  NA  NA  NA  NA
yes yes yes yes yes NA
NA  NA  NA  NA  NA  NA

我正在尝试找到一种方法来通过多个列来更改它们,以便R将查看行Y,列A并查看是否有“是”,然后如果有一个是为了创建一个新的列并输入“YES”作为Row Y的值

这是一种情况。在另一种情况下,R将转到行Y,然后执行相同的功能,但如果找不到YES,则它将查找“否”,如果有“否”,则输入“否”进入新创建的列

最后,最后一种可能性是既没有“是”也没有“否”,在这种情况下,我希望R将“NA”放入新创建的列中

我希望将此命令执行到行Y + 1300(数据集的末尾)

重要提示:还让我失望的是,最后一栏是为了让它本质地提出相反的问题,所以我希望将“YES”和“NO”翻转为相反的(YES成为否,反之亦然)在R循环命令之前

编辑:我原本打算使用for循环但是有太多不同的组合,所以我希望找到一种更有效的方法来简化命令

编辑:每一行代表一个不同的参与者,所以我想看看他们是否对任何A-E列回答“是”,对于从不回答“否” 如果情况并非如此,那么看看他们是否对A-E列中的任何一个回答“否”,对于从不回答“是” 如果不是这样的话,那么对于所有这6列

,它们必须具有“NA”

2 个答案:

答案 0 :(得分:0)

我们可以在na.strings

中指定read.csv/read.table来执行此操作
df1 <- read.csv('yourfile.csv', na.strings = "NOT APPLICABLE")

答案 1 :(得分:0)

这是您的问题的一个解决方案:R与其他语言不同,因为它不总是需要循环来遍历数据的每个元素,因为它具有内置的“应用”功能(一些很棒的线程) R Grouping functions: sapply vs. lapply vs. apply. vs. tapply vs. by vs. aggregate在这个论坛上很好地解释了它们。)

所以,这里的代码是将“是”重新编码为1,将“否”重新编码为2,将“不适用”重新编码为NA,最后得到数字数据。

df <- data.frame(c("NOT APPLICABLE", "yes", "NOT APPLICABLE"),
                 c("NA", "NA", "NA"), 
                 c("yes", "yes", "yes"),
                 c("no", "NOT APPLICABLE", "yes"), stringsAsFactors = F)
# notice the stringAsFactors=F to make sure you get strings, not factors
colnames(df) <- c("A", "B", "C", "NEVER")
str(df)
df

# define the recode function
recode <- function(x)
  { x[x == "yes"] <- 1
    x[x == "no"] <- 2
    x[x=="NOT APPLICABLE"] <- NA
    x[x=="NA"] <- NA
    x <- as.numeric(x)}

# apply the function to desired data
data <- as.data.frame(lapply(df, recode))
data

拥有数字数据可以解决重新编码最后一个问题的问题(“反向编码”)。为此,你只需要这样做:

new_variable <- max_value + 1 - old_variable 

有关反向编码的详细信息,请参阅此处http://www.theanalysisfactor.com/easy-reverse-code/或仅使用Google反向编码。

现在,对于要创建新列的最后一部分,我并不真正了解您的数据结构。您有多个受访者和多个问题吗?问题是否嵌入受访者中?如果你更清楚,我可以帮忙。

编辑: 对于第二部分,请尝试:

# I modified the data slightly to make it more like yours:
df <- data.frame(c("NOT APPLICABLE", "NA", "yes", "yes"),
             c("NOT APPLICABLE", "NA", "yes", "no"), 
             c("NOT APPLICABLE", "NA", "NA", "no"),
             c("yes", "NA", "NA", "NA"), stringsAsFactors = F)
# notice the stringAsFactors=F to make sure you get strings, not factors
colnames(df) <- c("A", "B", "C", "NEVER")
str(df)
df

> data
   A  B  C NEVER
 1 NA NA NA     1
 2 NA NA NA    NA
 3  1  1 NA    NA
 4  1  2  2    NA

# counts the occurences of values by row
> data$yes <- rowSums(data == 1, na.rm = T)
> data$no <-  rowSums(data == 2, na.rm = T)

> data
   A  B  C NEVER yes no 
1 NA NA NA     1   1  0  
2 NA NA NA    NA   0  0  
3  1  1 NA    NA   2  1  
4  1  2  2    NA   1  2  

# this last part creates the new column
data$new[data$yes==0 & data$no == 0] <- "NA"
data$new[data$yes!=0] <- "yes"
data$new[data$no!=0] <- "no"

> data
   A  B  C NEVER yes no new
1 NA NA NA     1   1  0 yes
2 NA NA NA    NA   0  0  NA
3  1  1 NA    NA   2  1  no
4  1  2  2    NA   1  2  no
> data[ , -c(5:6)] # use this to remove columns you don't need
    A  B  C NEVER new
1 NA NA NA     1 yes
2 NA NA NA    NA  NA
3  1  1 NA    NA  no
4  1  2  2    NA  no