选择数据框中的某些字符串

时间:2015-08-09 14:43:46

标签: r string

我有一个138x50以下类型的数据框:

B = matrix( c("ehre","e", "eh", "ehr", "ehrr", "f", "fi", "fie", "fiee", "fiel", "seil", "s", "se", "sei", "seii", "leiht", "l", "le", "lei", "leih", 3, 0, 0, 0, 1), nrow=5, ncol=5, byrow = FALSE) 
colnames(B)<-c("ana1_1", "ana2_1", "ana3_1", "ana4_1", "points")

我想创建一个新的df&#34; A&#34;,只包含正确答案并用空单元格替换错误答案/ NA:

A = matrix( c("ehre",NA, NA, NA, NA, NA, NA, NA, NA, "fiel", "seil", NA, NA, NA, NA, "leiht", NA, NA, NA, NA, 3, 0, 0, 0, 1), nrow=5, ncol=5, byrow = FALSE)
colnames(A)<-c("ana1_1", "ana2_1", "ana3_1", "ana4_1", "points")
  1. 如何创建A,而不是通过删除错误但选择正确的答案? (因为这需要较少的答案输入)。
  2. 如何计算一行中的字符串数量(创建第5列)?
  3. 非常感谢您的回复!

2 个答案:

答案 0 :(得分:3)

您可以使用grep执行此操作。根据“ana”列创建您想要成为非NA的vector个元素。

 v1 <- c('ehre', 'seil', 'leiht', 'fiel')

我们paste这些collapse='|'pattern中的grep参数一起 pat <- paste0('^(', paste(v1, collapse='|'), ')$')

 indx <- grepl('^ana', colnames(B))

为'ana'列

创建索引
 A1 <- B[,indx]

我正在创建一个新对象'A1',它将是仅具有'ana'列的修改矩阵'B'。

grepl

!的输出将是一个逻辑向量。我们否定(NA)它并将'A1'中列的相应元素分配给A1[!grepl(pat, A1)] <- NA

!is.na(A1)

要创建'points'列(虽然在示例中它已经创建),我们在'ana'列(rowSums)中获得非NA值的逻辑索引,得到{{1与原始数据集一起使用cbind

cbind(A1, Points=rowSums(!is.na(A1)))
#     ana1_1 ana2_1 ana3_1 ana4_1  Points
#[1,] "ehre" NA     "seil" "leiht" "3"   
#[2,] NA     NA     NA     NA      "0"   
#[3,] NA     NA     NA     NA      "0"   
#[4,] NA     NA     NA     NA      "0"   
#[5,] NA     "fiel" NA     NA      "1"   

将结果存储在'data.frame'中可能会更好,因为'Points'是一个'数字'向量,通过将其保持在matrix({{1}只能有一个matrix)。

答案 1 :(得分:2)

我从您的B开始,它也恰好包含"points",但该列不是必需的。我后来重新创建了它。因此,我首先将所有不匹配更改为NA,然后计算每行中的非NA数(忽略"points"列)以计算得分。 correct对象只是您正在寻找的正确答案的向量。

B = matrix( c("ehre","e", "eh", "ehr", "ehrr", "f", "fi", "fie", "fiee", "fiel", "seil", "s", "se", "sei", "seii", "leiht", "l", "le", "lei", "leih", 3, 0, 0, 0, 1), nrow=5, ncol=5, byrow = FALSE) 
colnames(B)<-c("ana1_1", "ana2_1", "ana3_1", "ana4_1", "points")



correct <- c("ehre","fiel","seil","leiht")
A <- B
A[!A%in%correct] <- NA
A[,"points"] <- apply(A[,colnames(A)!="points"], 1, function(x)sum(!is.na(x))) #tally up non-NA's to indicate points

此过程导致A的以下输出:

     ana1_1 ana2_1 ana3_1 ana4_1  points
[1,] "ehre" NA     "seil" "leiht" "3"   
[2,] NA     NA     NA     NA      "0"   
[3,] NA     NA     NA     NA      "0"   
[4,] NA     NA     NA     NA      "0"   
[5,] NA     "fiel" NA     NA      "1"